Novell Home

OpenPGM News

From Developer Community

Contents

Project Hosting Relocation

Novell is closing it's Forge project site and so the project has to move. The SVN server at Novell doesn't support SVN Replay so the source repository not moving yet.

The new home will be courtesy of Google Code:


update: Novell will be providing a SVN dump so I can use that to populate the Google repository. After that is done I can start migrating the documentation from the wiki.

update 2: Novell have dumped and locked the SVN repository and mailing list. A new mailing list has been setup on Google Groups. Awaiting access to said dump in order to upload to Google.

update 3: Invitations have been sent to all current list members to join the new Google Group hosted email list.

update 4: Source code has been migrated to Google SVN.


--Steve-o 2009-09-30

2.0 Beta 3

The 2.0 branch is starting to stabilize, passing unit and network tests. Many bug fixes and performance enhancements with bus based transports, i.e. both send and receive enabled transports.

  • A patch is now included for MinGW32 in order to use the advanced multicast socket features available on other environments.
  • Speed has improved by changing internal locking mechanisms with atomic operations and consolidation of transport mutexes.
  • The API has undergone a few changes in order to support clear return status on send and recv calls using PGMIOStatus based upon GLib IO Channel API return values.
  • A new return status, PGM_IO_STATUS_AGAIN2 to allow the application to decide whether to delay, sleep, or immediately retry on time blocked sockets.
  • New function pgm_transport_get_rate_remaining() to calculate the time remaining on a time-blocked transport.
  • Re-purposed return status, PGM_IO_STATUS_EOF to indicate transport closed in another thread.
  • Return status PGM_IO_STATUS_RESET indicates unrecoverable data-loss and a session reset.
  • Time stamping has been consolidated throughout callgraphs in order to reduce overhead on platforms with slow gettimeofday() functions.
  • Implement system wide shutdown locking enabling clean shutdown of active send() and recv() based calls.
  • Active transports are now reaped when calling pgm_transport_destroy().
  • Flushed transports broadcast SPMs with the FIN option tagged allowing peers to promptly clean state.
  • Update asynchronous API to operate blocking or non-blocking at the transport and application level.
  • Update examples to handle shutdown signalling with POSIX semaphores.
  • Pre-fill rate limit bucket to allow immediate send of leading broadcast SPMs.
  • Trickle fill rate limit bucket with sub-second increments.
  • Recv() API will now return details of underlying socket errors.
  • Update getifaddrs() processing to handle NULL addresses.
  • Update examples, documentation and migration guide with new API updates.

Download the tarball via the Novell Wiki or FTP site:

--Steve-o 2009-09-10

1.2.14 Release

The new 1.2 branch changes the default functionality of UDP encapsulated sockets to have SO_REUSEADDR set. This means multiple applications can listen on the same port with UDP sockets exactly the same as CAP_RAW privileged applications can with IP/PGM sockets.

--Steve-o 2009-09-03

Version Numbering

Labeled versions have now been updated to match the internal API numbers, meaning 1-0-0 release is actually 1-0-12, with the latest stable update at 1-0-13. The new 2.0 beta is currently at 2-0-6.

--Steve-o 2009-08-22

2.0 Migration Documentation

Details of how to migrate existing version 1.0 to version 2.0 code is now available on the wiki:


OpenPGM 2.0 is now functional and supported on OpenSolaris 2008.11 and 2009.06. Support can be found in the latest beta tarball:


Or with the 2.0 beta 2 tag in the SVN repository. To access this version of the 2.0 release use the following commands:

svn checkout https://forgesvn1.novell.com/…/release-2-0-0beta2

Build instructions continue as per installation platform detailed on the Build Library instructions page.

--Steve-o 2009-08-21

2.0 Beta Documentation

New documentation covering the changes from version 1.0 is now becoming available on the wiki, find listed as Beta under the documentation section.

The beta build is now functional on AMD64 and i386 releases of Ubuntu, Debian, and RHEL/CentOS. A Win32 cross-compile build is available using the MinGW tool chain on Linux. OpenSolaris support is currently incomplete.

--Steve-o 2009-08-19

2.0 Beta

The 1.1 development branch is now bumped to 2.0 beta as pretty much every API has been updated. The latest changes include unit testing coverage of every source module and inline timer processing: no need for an extra timer thread. As a beta, functionality is complete but full platform support is not currently available, only SCons 0.97 building is functional on Ubuntu AMD64.

Other News

ØMQ version 1.0.0 has been released bundling a fully integrated OpenPGM subsystem.

--Steve-o 2009-08-18

1.x Development

The 1.x development tree is progressing with the following changes:

  • Unified buffer management with PGM skbuffs, a variant of Linux kernel skbuffs.
  • Zero-copy passing of buffers from recvmsg() through to the receive window.
  • Unit tests for each component.
  • New performance testing tool pgmping.
  • Increased separation of code to simplify Windows and Solaris ports.

--Steve-o 2009-06-29

1.0 Branch

As a stable release updates to 1.0 are being maintained in the 1.0 branch in the SVN repository. To access the latest stable version of the 1.0 release use the following commands:

svn checkout https://forgesvn1.novell.com/…/release-1-0-0

Build instructions continue as per installation platform detailed on the Build Library instructions page.

--Steve-o 2009-06-28

1.0.0 General Availability

OpenPGM 1.0.0 Press Release from Miru Limited.

The following changes apply to the last release candidate.

  • Fix IPv6 socket option handling on Linux due to incompatible sizes with IPv4 options.
  • Fix blocked multi-APDU calls to pgm_transport_sendv().
  • Fix memory leak in state tracking on lost packets.
  • Fix memory leak in network parameter parsing.


Known Issues

  • Lack of IPv6 Zone Index support, see the article on IPv6 conformance for details. Support implemented in 1.1 branch.
  • O/S without user-level DSCP capability may error on transport creation, fixed in latest branch revision.


Future Plans

For 1.1 releases the follow features are being implemented.

  • Win32 native support via MinGW.
  • IPv6 Zone Index support for link-local unicast end points.
  • Long lifetime receive buffers allowing the application developer to continue zero-copy semantics after attaining a data buffer.
  • Improved buffer memory management.


--Steve-o 2009-05-15

openSUSE 11.1 Support

openSUSE from Novell is now a supported platform with rc8. One small minor difference is the lack of a ncurses panel library and so the ncurses example application is not supported.



--Steve-o 2009-05-11

1.0.0rc8

This release candidate adds OpenSolaris support for IA32/AMD64 architectures, SPARC is untested, along with validation for Ubuntu 9.04 and RHEL/CentOS 5.3. Build scripts have been updated for Scons version 1.0 and newer including libsoup 2.4 support as 2.2 is not readily available on OpenSolaris. Building with Scons is now modular enabling the core library to be built without libsoup or net-snmp dependencies.

For routed environments OpenPGM now tags IP ToS fields as per DSCP definitions (RFC 3246) as the previous interpretation is obsolete (RFC 1349).

There are no API changes to the previous release candidate 1.0.0rc7. This is the last expected release candidate pending major bug reports or new architecture support.

  • Fix transport destruction due to timer deadlock.
  • Fix packets filling lost sequence numbers.
  • Increment lead when NCF extends window to avoid duplicate placeholders.
  • Update SConstruct for v1.0+, 0.97-0.98 users (e.g. Ubuntu 8.04) must now use "scons -f SConstruct.097".
  • Clean up compile warnings for GCC 4.3.3 as per Ubuntu 9.04.
  • Update build scripts with two new config options: CONFIG_GETIFADDRS, CONFIG_GETHOSTBYNAME2
  • Add optional configuration for RTC and TSC.
  • Fix namespace collision warnings on poll().
  • Add custom pgm_sighandler_t type replicating sighandler_t on Linux.
  • Add epoll() configuration.
  • Add getprotobyname_r() configuration.
  • Add build script for Solaris.
  • Add support for libsoup 2.4.
  • Default & Solaris build script SConstruct now use libsoup 2.4.
  • 097 and RHEL4 build scripts default to libsoup 2.2.
  • Add build parameters for check, test, dev, examples, SNMP, and HTTP.
  • Default pgmrecv core example to poll() when epoll() is not available.
  • IP TOS fields should be interpreted as DSCP fields per RFC 3246.
  • Set all packets with Expedited Forwarding PHB, may require CAP_NET_ADMIN capability.
  • Ignore error if cannot set DSCP fields due to no capability (Ubuntu desktop vs. server).


(Update) Link to the rc8 download package, the Novell Wiki appears out of synchronisation with the FTP site contents:


--Steve-o 2009-04-17

1.0.0rc7

This release candidate makes available the senders TSI for application layer session tracking, along with improved rate handling at gigabit data rates, and bug fixes.

The ABI is broken for the pgm_msgv_t structure adding a pgm_tsi_t identifier, and adding a new function pgm_transport_recvfrom() to capture the TSI with basic single APDU buffer usage.

API documentation has been updated to reflect the changes of the rc7 releases.

  • Add new function pgm_transport_recvfrom() that allows capturing of sender TSI without needed to parse scatter/gather buffers.
  • Update examples to use new pgm_transport_recvfrom() form.
  • Add sender TSI to returned pgm_msgv_t objects, breaking ABI compatibility.
  • Add GSI and TSI string length defines for easier re-entrant handling.
  • Transport now passes TSI as an anonymous read-only identifier to receive windows which are subsequently tagged onto every APDU pgm_msgv_t object.
  • Update all pgm_msgv_t based examples to display sender TSI.
  • Partial APDUs trailing in the contiguous receive window are unrecoverable.
  • Remove pre-packet assembly rate check on single packet sends.
  • Fix double rate checks on non-blocking sends.
  • Reduce severity of window status notifications.
  • Reduce rate limit bucket fill to per-millisecond from second.
  • Cleanup timer context resources on transport destroy allowing a shared timer.
  • Update timer thread to indicate data lost rather than close the transport.
  • NAK lists and parity NAKs updated to send source GSI not receiver transport GSI.


--Steve-o 2009-03-21

1.0.0rc6

This release candidate introduces compatibility with Microsoft's PGM implementation in Windows 2008, Source-Specific Multicast (SSM), notification of affected source when unrecoverable data loss is detected, support for Net-SNMP 5.4.1, and general conformance, performance, and reliability improvements.

The ABI is broken again, to implement both Any-Source Multicast (ASM) and Source-Specific Multicast (SSM) on pgm_transport_create(). The gsr_source members actually mean the address of the multicast source for SSM or should be the same as gsr_group for ASM. pgm_create_ipv4_gsi() now assumes the node address for easier usage.

API documentation has been updated to reflect the changes of the rc6 releases.

  • Display extra packet options per Microsoft PGM implementation.
  • Improvement performance handling deep trash stacks.
  • SSM support via new API and re-purposing group source parameters.
  • Fix SPM NLA to be from send interface not receive.
  • Move waiting_mutex outside of check_peer_nak_state in timer thread to prevent dead lock with receiver.
  • Fix sending of SPMRs on tight context switch before adding new peer to the transport peer list.
  • Fix libex log handler when using GLog domains.
  • Fix calculating checksum for TSDUs sourced by application-vector.
  • Fix hanging during to deadlock when pgm_transport_bind() fails.
  • Delay expiration of peers with data committed to the application.
  • Advance receive window commit trail on data loss.
  • Send calls return -1, errno set to EMSGSIZE if message is too large.
  • Asynchronous helper thread will not terminate on dataloss when close-on-failure is FALSE.
  • Implement ECONNRESET errno return for pgm_transport_recv* for all dataloss events.
  • Transport receive functions return ECONNRESET on dataloss, then ENOTCONN as per closed state.
  • Update transport receive functions to process commit data by packets instead of bytes supporting 0 byte reads.
  • Add extra API calls to display GSI values.
  • Make IPv4 based GSI generator less cumbersome by finding host IPv4 address.
  • Easier to assign GSI using unsigned char's than signed.
  • Update SNMP code for slightly broken Net-SNMP 5.4.1 - errors are now treated as warnings.
  • Implement bytes and messages delivered per receiver.
  • Fix SNMP handling for receive-only transports.
  • Fix byte order conversion in SNMP receiver statistics.
  • Update PGM_PC_RECEIVER_DATA_MSGS_RECEIVED to mean APDUs instead of packets so comparison with PGMRECEIVERMSGSDELIVEREDTOAPP is possible.
  • Receive window will always return on first dropped packet.
  • Receive window will not let trail advance beyond commit trail, however waiting sequence numbers will be dropped.
  • Transport recv() calls will return early with contiguous data, leaving lost packets for latter clear up.
  • Demote lost packet warnings to trace.
  • Do not allow SPMs or new ODATA packets to extend commit window.
  • Return TSI and packet loss count on error to recv calls.
  • Add pgm_sock_err_t structure for data loss return details.
  • Mask out OPT_END bit from unknown PGM option types.
  • NAKs and SPMRs should use peer GSI.
  • Add extra check against GSI for upstream packets.

--Steve-o 2009-03-07

1.0.0rc5

This release candidate introduces further test suites to ensure stable and reliable code. The ABI is broken again, to reduce confusion by matching parameter order on pgm_transport_create() and pgm_if_parse_transport(), and adding a boolean parameter to pgm_transport_set_close_on_failure() and pgm_transport_set_send_only() for better clarity.

API documentation has been updated to reflect the changes of the rc5 releases.

  • Support even more simple network parameters without leading semi-colon.
  • Fix discovering repair address under IPv6 UDP encapsulation.
  • Improve CMake scripts to support 2.4 and 2.6 forward compatibilty.
  • Cleanup additional strict compiler warnings regarding shadowing variables.
  • Match parameter order on pgm_if_parse_transport() with pgm_transport_create().
  • Allow network parameter to be single DNS name that resolves to a multicast group.
  • Replace TSC calibration by RTC by selected sleep method.
  • Increase TSC calibration loop from 20ms to 4s.
  • Display message before and after calibration loop.
  • Add environment variable RDTSC_FREQUENCY to skip calibration loop or override the kernel detected tick rate.
  • Read from /proc/cpuinfo if available and use the kernel detected tick rate.
  • Add useful warning message for unstable TSC sources and force stable clocks.
  • Fix for repeat RDATA partial checksum store causing checksum errors on repeat sends.
  • Make default SPM heartbeat times more friendly to context switching.
  • Add flag to pgm_transport_set_close_on_failure() and pgm_transport_set_send_only() for consistent API.
  • Change default sleep to usleep as it now offers high resolution sleep and doesn't hog the /dev/rtc device.
  • Add separate SConstruct for RHEL4, call: "scons -f SConstruct.RHEL4".

--Steve-o 2009-02-10

ØMQ/0.5

PGM experimental support is now available as part of ØMQ version 0.5. ØMQ or ZeroMQ is a messaging middleware that adds high level functionality like routing and queueing which is typically required for advanced application communication.

Development on OpenPGM 1.0 rc5 is continuing with improvements to the network and unit test suite to ensure correct operation of all modules.


Other News:

Red Hat releases Red Hat MRG 1.1 with support for InfiniBand, .NET, and additional queueing functions.

--Steve-o 2009-02-07

GStreamer

Demo Gstreamer plugins acting as a Gstreamer sink/PGM source (pgmsink) and Gstreamer source/PGM source (pgmsrc) have been updated to meet the 1.0.0rc4 ABI. These can be used with the gst-launch command line or any Gstreamer compatible application. Example pipelines are provided for h263, x264, theora, and JPEG multi-part streams. Multicast loop is enabled by default for single host testing.

Example x264 source:

GST_PLUGIN_PATH=. gst-launch-0.10 \
	v4lsrc ! \
	videorate ! \
	video/x-raw-yuv,width=320,height=240,framerate=15/1 ! \
	x264enc byte-stream=true bitrate=128 bframes=4 b_pyramid=true \
               me=dia trellis=false key_int_max=4000 threads=1 ! \
	rtph264pay ! \
	pgmsink

Example x264 receiver:

GST_PLUGIN_PATH=. gst-launch-0.10 \
	pgmsrc caps="application/x-rtp" ! \
	rtph264depay ! \
	ffdec_h264 ! \
	videoscale ! \
	video/x-raw-yuv,width=640,height=480 ! \
	timeoverlay ! \
	autovideosink


QVGA video feed x264 compressed at 128kbps scaled to 640x480
Enlarge
QVGA video feed x264 compressed at 128kbps scaled to 640x480

Download and build with SCons. Requires GStreamer 0.10 and dependencies.

http://developer.novell.com/wiki/index.php/Special:Downloads/openpgm/gstpgm3.tar.bz2


1.0.0rc4

This release candidate transitions over to the CMake build system together with improved 32-bit architecture support. The ABI is broken again to add support for setting the PGM source port.

API documentation has been updated to reflect the changes of the rc3 and rc4 releases.

  • Improve detection of packet destination groups when multiple asymmetric groups are being used. For example using the command pgmrecv -n ";226.0.0.1,226.0.0.2,227.0.0.1", when peers only exist on one of the receiving groups it is necessary to detect the received group in order to correctly select the group to send NAK request to. Group is recorded for initial packet and all subsequent SPM broadcasts.
  • Update the web interface to handle non-bidirectional transports, display activity time in a relative format for easier reading, e.g. "2 minutes ago" rather than "Wed Nov 19 17:39:58 HKT 2008".
  • Add source port to pgm_transport_create() function, breaks ABI compatibility. This allows creation of applications that can re-use PGM sessions across restarts, typically useful for large file transfer carousels.
  • Fix major bug in 32-bit time calculations due to carry errors not present on 64-bit architectures.
  • Add optional multicast loop & socket re-use function (pgm_transport_set_multicast_loop()) to enable single host testing on Linux architecture which doesn't support multicast across it's loopback devices. Use is highly discouraged in production environments due to overhead of duplicate processing of all incoming packets.
  • Transport event helpers now return EBADF when transport has closed.
  • pgmrecv and pgmsend demo applications automagically use gettimeofday()/usleep() when enabling multicast loop.
  • Added CMake build script as alternative to SCons, caveat: assembler is not supported in CMake 2.4.
  • Simplify SCons build scripts by merging SNMP/HTTP management into default environment.


--Steve-o 2008-11-19

1.0.0rc3

Changes in this revision compared with rc2, minor changes to application code are required to handle IPv6 multicast group specifications.

  • IPv6 support by migration to RFC 3678. Existing code requires updates to interface definitions.
  • Example applications updated to RFC 3678 interface definitions.
  • Example application code updated with new minimal header file requirements.
  • When using blocking pgm_transport_recv() events are now discovered using poll() instead of select() to improve handling of coalesced events and reduce idle processing time.
  • SCons build files updated according to deprecated features of the Scons 0.98 release.
  • Use Linux kernel eventfd wait/notify mechanism where supported, should be Glibc ≥ 2.8.
  • Make build time details in addition to library version information available to application code.
  • Defer repair elimination till after repair packet has been sent. This allows elimination to occur whilst repair data is being calculated, optimising efficiency of expensive Reed Solomon parameters.

--Steve-o 2008-11-16

IPv6

OpenPGM has been engineered for dual stack support, both IPv4 and IPv6, but to-date only IPv4 has been functional. As of revision 271 in the development trunk initial functioning IPv6 support now exists with the help of transition to full RFC 3678 multicast source filter socket interface objects.

This is a relatively minor API change which should only consist of renaming pgm_sock_mreq structures to RFC 3678 compliant group_source_req, and if using UDP encapsulation updating smr_multiaddr and smr_interface member variable names to gsr_group and gsr_source. See the pgmsend diffs as an example of required code changes.

RHEL 4

A method to build on RHEL/CentOS 4 is now available, however it does not work with the default GLib tree. RHEL bundles an updated GLib tree for the Evolution mail client and this has been used to enable OpenPGM construction. Support from Red Hat is likely to be limited for this library set.

--Steve-o 2008-10-14

CentOS 5.2

Support for the latest RHEL/CentOS supported platform is now bumped to 5.2. Upgrading from 5.1 is a simple yum update. Further details available in the CentOS 5.2 release announcement.

Other News:

Red Hat release version 1.0 of Red Hat Enterprise MRG.

--Steve-o 2008-06-25

Ubuntu 8.04 and CentOS 5.2

The Build Library instructions have been updated for the recent Ubuntu 8.04 release. The latest RHEL/CentOS supported platform remains version 5.1.

RedHat have announced the release of RedHat Enterprise Linux 5.2, whilst the CentOS team guestimate a mid-June CentOS 5.2 release.

Other News:

Cisco announces an open source messaging protocol called Etch, no official details on cisco.com, but CIO.com details Etch beta release expected mid-July.

update: Etch project page now available in the Cisco Developer Community as part of the Cisco Unified Application Environment (CUAE), with plans to join the Apache Incubator.

--Steve-o 2008-05-27

Reed-Solomon Forward Error Correction

Forward error correction (FEC) provides two advantages, the ability to recover lost packets from extra redundant information sent with original data, and the ability to recover any lost packet with each extra parity packet. The cost is extra processing time calculating the redundant parity packets and regenerating lost packets.

The PGM protocol transport can elect to offer either or both forms of error correction together with regulation selective re-transmission requests.

Other News:

The MIT DARPA Urban Challenge Team published their Lightweight Communications and Marshalling (LCM) library. Similar to Rendezvous 8 it provides an in-process daemon but with basic subject naming, XDR message format, and optional reliability. APIs for C, Java, and Python.

--Steve-o 2008-03-18

Open Computer Vision Library

The OpenCV library from Intel aimed at real time computer vision. It includes a high level API for capturing from any local video source and displaying in a window with only a few lines. PGM enables the distribution of video sources across a network.

The example application cvdd sources from a local camera, compresses each frame with JPEG 2000 and multicasts over the network with the OpenPGM stack, with a different command line parameter the same application can subscribe to PGM sources and display on the local monitor. Native IPL images are used and so the code can be extended to implement network computer vision systems.

--Steve-o 2008-02-10

Send Vectors

The sending side also receives a re-factoring and now features non-blocking support with respect to the rate control parameters and the ability to send a vector of APDUs.

The OpenPGM C Reference is now up to date for both new API updates.

--Steve-o 2008-02-08

Overhauling

The receive side of the OpenPGM stack is undergoing a huge overhaul, it will now allow direct synchronous non-blocking receiving of message vectors of TPDU sized scatter/gather IO vectors. Unfortunately there is no matching Linux API for zero-copy UDP or message vectors (vectors of recvmsg()), but this reduces the overhead the stack imposes for significantly high data rates.

Updated documentation covering the new APIs with examples for epoll(), poll(), select() and their asynchronous counterparts will follow shortly.

--Steve-o 2008-02-01

Documentation

New documentation has been started to help newcomers understand and use OpenPGM, a Concepts guide covering the fundamentals and programming guidelines, and C Reference for the developers API.

Other News:

Red Hat announces Red Hat MRG (/mer.ʤe/ or merge), a new platform label for the combination of AMQP compliant messaging software, Apache Qpid, a new RHEL 5.1 real time kernel, and grid scheduler (RHG) for High Throughput Computing (HTC) and High Performance Computing (HPC).

--Steve-o 2007-12-08

Development

Current research and development is on the AMD64 (also known as x86-64 as a generic term including Intel's EMT64) platform with only 64 bit code on Linux, progress can be tracked on the miru blog.

Other News:

RMM is a Reliable Multicast Messaging kit from IBM Haifa Labs with extensions available for large object transfer. IBM previously detailed RMTP, Reliable Multicast Transport Protocol in 1998 in partnership with NTT.

--Steve-o 2007-04-19

High-speed Messaging

There are many published papers on UDP bulk transfer protocols and algorithms, these stem from Internet2 research between universities transferring gigantic datasets. The goal is high bandwidth and reliability, TCP over long distances has problems with maintaining high-speed data transfers and is only ever reliable: when transfer gigabyte to terabyte datasets a guarantee of transfer is preferred as re-downloading is not practical. Some of these concepts can be used with PGM however the other goal of PGM is for latency critical applications, over low latency links, that would like high bandwidth: the best of all worlds. The side effects are that NAK's have to be sent expediently rather than delayed (to cope with high latency links), and that many small packets need to be transmitted rather than large jumbo frames, or even jumbograms.

The TCP/IP stack has seen many developments to help speed up the internet with Scatter/Gather I/O, and new functions like sendfile() implementing zero copy semantics to reduce moving around blocks of memory which slows things down. However there is not currently support for sending many small packets, each currently require a context switch between user space and the kernel slowing handling down. One option is implementing the PGM protocol inside the kernel, however there are many problems with how the sending window is kept and managed. Microsoft Windows XP has an implementation of PGM that uses Microsoft Message Queuing (MSMQ) and file stores for reliability.

Other News:

Emcaster is a high-speed PGM interface in .NET (C#) using MSMQ for its sending window and claims performance on modest hardware to 0.5 Gb per second.

--Steve-o 2007-03-15

Novell® Making IT Work As One

© 2009 Novell, Inc. All Rights Reserved.