diff options
author | Sebastien Braun | 2010-10-03 16:14:44 +0200 |
---|---|---|
committer | Sebastien Braun | 2010-10-03 16:14:44 +0200 |
commit | ffee0868ef1341cfb7622821431cb73c52590962 (patch) | |
tree | bc96be65e0346ea25a8effb2118de59b08d54466 /3rdparty | |
parent | Add patch for OpenPGM to fix switch() fallthrough (diff) | |
download | pvs-ffee0868ef1341cfb7622821431cb73c52590962.tar.gz pvs-ffee0868ef1341cfb7622821431cb73c52590962.tar.xz pvs-ffee0868ef1341cfb7622821431cb73c52590962.zip |
Assorted Multicast Fixes:
- Upgrade bundled OpenPGM to SVN r1135
- Timing fixes: Make all rate-limited and timer-pending operation wait
for at least 1ms to avoid busy-waiting
- No distinction between sending and receiving sockets when setting
up socket options (Receivers need to be able to send anyway when
using PGMCC).
- Switch from fixed-rate transmission to using PGMCC for congestion
control.
- Remove some obnoxious debugging outputs
- Some white space fixes
- Introduce a short waiting time before actually starting file transmission
in order to allow enough SPM messages to be sent so that receivers
can initialize properly.
- Fix MCASTFTANNOUNCE message to include full file name instead of basename.
- Fix generateMcastTransferID in order to gather more random IDs. PVSGUI
may become confused if transfer IDs are reused.
- Properly dispose of clientFileReceiveDialog when multicast transfer is
finished.
- Properly display transfer size in clientFileReceiveDialog
Diffstat (limited to '3rdparty')
-rw-r--r-- | 3rdparty/01-libpgm-fix-switch-fallthrough.patch | 11 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135-0001-sigsegv-in-txw.patch | 28 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135-0002-correct-checksum-calculation.patch | 17 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135-0003-fix-rdata-congestion-control.patch | 42 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/doc/draft-ietf-rmt-bb-pgmcc-03.txt (renamed from 3rdparty/openpgm-svn-r1085/doc/draft-ietf-rmt-bb-pgmcc-03.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/doc/rfc3208.txt (renamed from 3rdparty/openpgm-svn-r1085/doc/rfc3208.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/COPYING (renamed from 3rdparty/openpgm-svn-r1085/pgm/COPYING) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/INSTALL (renamed from 3rdparty/openpgm-svn-r1085/pgm/INSTALL) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/LICENSE (renamed from 3rdparty/openpgm-svn-r1085/pgm/LICENSE) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/README (renamed from 3rdparty/openpgm-svn-r1085/pgm/README) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgm (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgm) | 7 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgm89 (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgm89) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgmex (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgmex) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgmhttp (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgmhttp) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgmsnmp (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgmsnmp) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct) | 25 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.097 (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.097) | 43 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.097.intelc (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.097.intelc) | 98 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.097.mingw64 (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.097.mingw64) | 43 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.097.sunstudio (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.097.sunstudio) | 52 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.Debian4 (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.Debian4) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.FreeBSD80 (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.FreeBSD80) | 46 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.OpenSolaris (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.OpenSolaris) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.RHEL4 (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.RHEL4) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.Solaris.gcc64 (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.Solaris.gcc64) | 46 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.Solaris.sungcc (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.Solaris.sungcc) | 36 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.Solaris.sunstudio (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.Solaris.sunstudio) | 36 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.clang (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.clang) | 49 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.mingw (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.mingw) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/SConstruct.mingw-wine (renamed from 3rdparty/openpgm-svn-r1085/pgm/SConstruct.mingw-wine) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/atomic_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/atomic_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/backtrace.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/backtrace.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/checksum.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/checksum.c) | 34 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/checksum_perftest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/checksum_perftest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/checksum_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/checksum_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/crossmingw.py (renamed from 3rdparty/openpgm-svn-r1085/pgm/crossmingw.py) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/crossmingw64.py (renamed from 3rdparty/openpgm-svn-r1085/pgm/crossmingw64.py) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/engine.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/engine.c) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/engine.c.c89.patch | 58 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/engine_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/engine_unittest.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/error.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/error.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/error_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/error_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/SConscript (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/SConscript) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/SConscript89 (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/SConscript89) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/async.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/async.c) | 8 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/async.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/async.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/blocksyncrecv.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/blocksyncrecv.c) | 40 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/daytime.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/daytime.c) | 44 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/enonblocksyncrecv.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/enonblocksyncrecv.c) | 44 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/enonblocksyncrecvmsg.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/enonblocksyncrecvmsg.c) | 44 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/enonblocksyncrecvmsgv.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/enonblocksyncrecvmsgv.c) | 44 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/getopt.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/getopt.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/getopt.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/getopt.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/pgmdump.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/pgmdump.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/pgmping.cc (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/pgmping.cc) | 258 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/pgmrecv.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/pgmrecv.c) | 44 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/pgmsend.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/pgmsend.c) | 32 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/pgmtop.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/pgmtop.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/ping.proto (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/ping.proto) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/pnonblocksyncrecv.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/pnonblocksyncrecv.c) | 44 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/purinrecv.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/purinrecv.c) | 63 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/purinrecvcc.cc (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/purinrecvcc.cc) | 58 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/purinsend.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/purinsend.c) | 42 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/purinsendcc.cc (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/purinsendcc.cc) | 34 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/shortcakerecv.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/shortcakerecv.c) | 42 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/examples/snonblocksyncrecv.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/examples/snonblocksyncrecv.c) | 44 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/fec-block.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/fec-block.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/fec.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/fec.txt) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/galois_generator.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/galois_generator.pl) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/gcov-parse.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/gcov-parse.pl) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/gcov-seed.sh (renamed from 3rdparty/openpgm-svn-r1085/pgm/gcov-seed.sh) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/gcov.sh (renamed from 3rdparty/openpgm-svn-r1085/pgm/gcov.sh) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/getifaddrs.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/getifaddrs.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/getifaddrs.c.c89.patch | 218 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/getifaddrs_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/getifaddrs_unittest.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/getnodeaddr.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/getnodeaddr.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/getnodeaddr.c.c89.patch | 59 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/getnodeaddr_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/getnodeaddr_unittest.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/gsi.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/gsi.c) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/gsi.c.c89.patch | 53 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/gsi_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/gsi_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/hashtable.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/hashtable.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/hashtable.c.c89.patch | 47 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/histogram.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/histogram.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/histogram.c.c89.patch | 212 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/htdocs/404.html (renamed from 3rdparty/openpgm-svn-r1085/pgm/htdocs/404.html) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/htdocs/base.css (renamed from 3rdparty/openpgm-svn-r1085/pgm/htdocs/base.css) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/htdocs/convert_to_macro.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/htdocs/convert_to_macro.pl) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/htdocs/robots.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/htdocs/robots.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/htdocs/xhtml10_strict.doctype (renamed from 3rdparty/openpgm-svn-r1085/pgm/htdocs/xhtml10_strict.doctype) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/http.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/http.c) | 17 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/http_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/http_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/if.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/if.c) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/if.c.c89.patch | 376 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/if_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/if_unittest.c) | 4 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/checksum.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/checksum.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/engine.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/engine.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/features.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/features.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/fixed.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/fixed.h) | 16 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/framework.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/framework.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/galois.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/galois.h) | 17 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/getifaddrs.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/getifaddrs.h) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/getnodeaddr.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/getnodeaddr.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/hashtable.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/hashtable.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/histogram.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/histogram.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/i18n.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/i18n.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/indextoaddr.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/indextoaddr.h) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/indextoname.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/indextoname.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/inet_network.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/inet_network.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/ip.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/ip.h) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/list.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/list.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/math.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/math.h) | 11 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/md5.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/md5.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/mem.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/mem.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/messages.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/messages.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/nametoindex.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/nametoindex.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/net.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/net.h) | 17 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/notify.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/notify.h) | 67 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/packet_parse.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/packet_parse.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/packet_test.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/packet_test.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/pgmMIB.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/pgmMIB.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/pgmMIB_columns.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/pgmMIB_columns.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/pgmMIB_enums.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/pgmMIB_enums.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/processor.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/processor.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/queue.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/queue.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/rand.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/rand.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/rate_control.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/rate_control.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/receiver.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/receiver.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/reed_solomon.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/reed_solomon.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/rxw.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/rxw.h) | 9 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/slist.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/slist.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/sn.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/sn.h) | 52 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/sockaddr.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/sockaddr.h) | 4 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/socket.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/socket.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/source.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/source.h) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/sqn_list.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/sqn_list.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/string.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/string.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/thread.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/thread.h) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/time.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/time.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/timer.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/timer.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/tsi.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/tsi.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/txw.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/txw.h) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/wsastrerror.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/impl/wsastrerror.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/atomic.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/atomic.h) | 8 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/backtrace.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/backtrace.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/engine.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/engine.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/error.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/error.h) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/gsi.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/gsi.h) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/http.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/http.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/if.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/if.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/ip/pgm.hh (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/ip/pgm.hh) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/ip/pgm_endpoint.hh (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/ip/pgm_endpoint.hh) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/list.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/list.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/log.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/log.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/macros.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/macros.h) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/mem.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/mem.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/messages.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/messages.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/msgv.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/msgv.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/packet.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/packet.h) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/pgm.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/pgm.hh (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm.hh) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/pgm_socket.hh (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm_socket.hh) | 8 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/signal.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/signal.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/skbuff.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/skbuff.h) | 15 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/snmp.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/snmp.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/socket.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/socket.h) | 14 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/time.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/time.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/tsi.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/tsi.h) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/types.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/types.h) | 16 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/version.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/version.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/winint.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/winint.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/pgm/wininttypes.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/include/pgm/wininttypes.h) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/indextoaddr.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/indextoaddr.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/indextoaddr.c.c89.patch | 44 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/indextoaddr_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/indextoaddr_unittest.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/indextoname.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/indextoname.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/indextoname.c.c89.patch | 29 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/inet_network.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/inet_network.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/inet_network.c.c89.patch | 76 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/inet_network_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/inet_network_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/ip_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/ip_unittest.c) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/list.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/list.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/log.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/log.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/math.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/math.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/math.c.c89.patch | 16 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/md5.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/md5.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/md5.c.c89.patch | 34 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/md5_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/md5_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/mem.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/mem.c) | 1 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/mem.c.c89.patch | 145 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/memcheck (renamed from 3rdparty/openpgm-svn-r1085/pgm/memcheck) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/messages.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/messages.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/messages.c.c89.patch | 91 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/mibs/PGM-MIB-petrova-01.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/mibs/PGM-MIB-petrova-01.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/mld-semantics.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/mld-semantics.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/msfec.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/msfec.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/nametoindex.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/nametoindex.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/nametoindex.c.c89.patch | 89 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/net-snmp.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/net-snmp.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/net.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/net.c) | 10 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/net.c.c89.patch | 67 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/net_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/net_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/options.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/options.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/packet_parse.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/packet_parse.c) | 28 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/packet_parse.c.c89.patch | 121 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/packet_parse_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/packet_parse_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/packet_test.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/packet_test.c) | 6 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/packet_test.c.c89.patch | 401 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/packet_test_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/packet_test_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/pgmMIB.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/pgmMIB.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/pgmMIB_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/pgmMIB_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/plan.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/plan.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/queue.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/queue.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/rand.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/rand.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/rand.c.c89.patch | 34 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/rate_control.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/rate_control.c) | 8 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/rate_control.c.c89.patch | 62 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/rate_control_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/rate_control_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/receiver.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/receiver.c) | 38 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/receiver.c.c89.patch | 887 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/receiver.c.rej | 37 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/receiver_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/receiver_unittest.c) | 93 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/recv.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/recv.c) | 7 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/recv.c.c89.patch | 404 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/recv_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/recv_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/reed_solomon.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/reed_solomon.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/reed_solomon.c.c89.patch | 467 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/reed_solomon_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/reed_solomon_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/rxw.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/rxw.c) | 12 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/rxw.c.c89.patch | 565 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/rxw_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/rxw_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/signal.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/signal.c) | 5 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/signal_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/signal_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/skbuff.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/skbuff.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/slist.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/slist.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/snmp.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/snmp.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/snmp_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/snmp_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/sockaddr.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/sockaddr.c) | 4 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/sockaddr.c.c89.patch | 75 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/socket.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/socket.c) | 360 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/socket.c.c89.patch | 403 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/socket_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/socket_unittest.c) | 209 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/source.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/source.c) | 32 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/source.c.c89.patch | 1021 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/source.c.orig | 2344 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/source.c.rej | 17 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/source_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/source_unittest.c) | 60 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/string.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/string.c) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/string.c.c89.patch | 39 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/PGM/Test.pm (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/PGM/Test.pm) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/SConscript (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/SConscript) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/ambient_spm.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ambient_spm.pl) | 1 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/apdu.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/apdu.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/apdu_parity.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/apdu_parity.pl) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/app.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/app.c) | 462 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/async.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/async.c) | 31 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/async.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/async.h) | 6 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/dump-json.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/dump-json.c) | 8 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/dump-json.h (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/dump-json.h) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/heartbeat_spm.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/heartbeat_spm.pl) | 1 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/monitor.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/monitor.c) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/nak.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/nak_cancellation.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak_cancellation.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/nak_list.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak_list.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/nak_parity.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak_parity.pl) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/nak_repeat.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak_repeat.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/ncf.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ncf.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/ncf_cancellation.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ncf_cancellation.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/ncf_list.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ncf_list.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/ncf_suppression.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ncf_suppression.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/odata.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata.pl) | 1 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/odata_completion.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_completion.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/odata_jump.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_jump.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/odata_jump_parity.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_jump_parity.pl) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/odata_number.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_number.pl) | 1 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/odata_rate.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_rate.pl) | 1 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/odata_reception.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_reception.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/on-demand_spm.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/on-demand_spm.pl) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/outofwindow_ncf.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/outofwindow_ncf.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion_parity.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion_parity.pl) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion_parity_var_pktlen.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion_parity_var_pktlen.pl) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/rdata_jump.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/rdata_jump.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/rdata_reception.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/rdata_reception.pl) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/sim.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/sim.c) | 1247 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/spm.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spm.pl) | 1 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/spm_jump.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spm_jump.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/spm_jump2.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spm_jump2.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/spm_reception.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spm_reception.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/spmr.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spmr.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/spmr_after_spm.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spmr_after_spm.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/spmr_from_odata.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spmr_from_odata.pl) | 2 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/test/spmr_suppression.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spmr_suppression.pl) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/sudoers.example (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/sudoers.example) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/test/test.conf.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/test.conf.pl) | 12 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/thread.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/thread.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/thread.c.c89.patch | 137 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/time.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/time.c) | 6 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/time.c.c89.patch | 115 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/time_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/time_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/timer.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/timer.c) | 6 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/timer.c.c89.patch | 63 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/timer_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/timer_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/token and leaky bucket.txt (renamed from 3rdparty/openpgm-svn-r1085/pgm/token and leaky bucket.txt) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/tsi.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/tsi.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/tsi.c.c89.patch | 33 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/tsi_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/tsi_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/txw.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/txw.c) | 6 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/txw.c.c89.patch | 223 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/txw_unittest.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/txw_unittest.c) | 0 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/valgrind.supp (renamed from 3rdparty/openpgm-svn-r1085/pgm/valgrind.supp) | 0 | ||||
-rwxr-xr-x | 3rdparty/openpgm-svn-r1135/pgm/version_generator.py (renamed from 3rdparty/openpgm-svn-r1085/pgm/version_generator.py) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/win/mingw32-runtime_3.13-1openpgm3.diff (renamed from 3rdparty/openpgm-svn-r1085/pgm/win/mingw32-runtime_3.13-1openpgm3.diff) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/win/mingw32-runtime_3.15.2-0openpgm1.diff (renamed from 3rdparty/openpgm-svn-r1085/pgm/win/mingw32-runtime_3.15.2-0openpgm1.diff) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/win64/mingw-w64-bin_x86-64-linux_4.4.1-1openpgm1.diff (renamed from 3rdparty/openpgm-svn-r1085/pgm/win64/mingw-w64-bin_x86-64-linux_4.4.1-1openpgm1.diff) | 2 | ||||
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/wsastrerror.c (renamed from 3rdparty/openpgm-svn-r1085/pgm/wsastrerror.c) | 0 |
316 files changed, 12125 insertions, 1511 deletions
diff --git a/3rdparty/01-libpgm-fix-switch-fallthrough.patch b/3rdparty/01-libpgm-fix-switch-fallthrough.patch deleted file mode 100644 index 23dfc9c..0000000 --- a/3rdparty/01-libpgm-fix-switch-fallthrough.patch +++ /dev/null @@ -1,11 +0,0 @@ -diff -Naur pgm/socket.c pgm-fixed/socket.c ---- pgm/socket.c 2010-05-22 06:42:00.000000000 +0200 -+++ pgm-fixed/socket.c 2010-07-14 19:24:43.710669589 +0200 -@@ -641,6 +641,7 @@ - break; - sock->spmr_expiry = *(const int*)optval; - status = TRUE; -+ break; - - /* size of receive window in sequence numbers. - * 0 < rxw_sqns < one less than half sequence space diff --git a/3rdparty/openpgm-svn-r1135-0001-sigsegv-in-txw.patch b/3rdparty/openpgm-svn-r1135-0001-sigsegv-in-txw.patch new file mode 100644 index 0000000..af6d4fd --- /dev/null +++ b/3rdparty/openpgm-svn-r1135-0001-sigsegv-in-txw.patch @@ -0,0 +1,28 @@ +Problem: OpenPGM generates a SIGSEGV upon accessing peer->sock->use_pgmcc. + This is because the code assumes that the queue list entry comes first + in the definition of struct pgm_peer_t, which it does not (anymore?). + +diff -Naur openpgm-r1135-pristine/pgm/receiver.c openpgm-svn-r1135/pgm/receiver.c +--- openpgm-r1135-pristine/pgm/receiver.c 2010-09-06 20:41:52.000000000 +0200 ++++ openpgm-svn-r1135/pgm/receiver.c 2010-09-24 12:40:07.000000000 +0200 +@@ -71,7 +71,9 @@ + pgm_assert (NULL != window); + pgm_assert (NULL != window->ack_backoff_queue.tail); + +- const struct pgm_peer_t* peer = (const struct pgm_peer_t*)window->ack_backoff_queue.tail; ++ const struct pgm_peer_t* peer = (const struct pgm_peer_t*)window->ack_backoff_queue.tail->data; ++ pgm_assert (NULL != peer); ++ + pgm_assert (peer->sock->use_pgmcc); + return peer->ack_rb_expiry; + } +@@ -416,6 +418,9 @@ + sock->ack_c_p); + peer->spmr_expiry = now + sock->spmr_expiry; + ++/* Prepare ack_link */ ++ peer->ack_link.data = peer; ++ + /* add peer to hash table and linked list */ + pgm_rwlock_writer_lock (&sock->peers_lock); + pgm_peer_t* entry = _pgm_peer_ref (peer); diff --git a/3rdparty/openpgm-svn-r1135-0002-correct-checksum-calculation.patch b/3rdparty/openpgm-svn-r1135-0002-correct-checksum-calculation.patch new file mode 100644 index 0000000..b78dc3c --- /dev/null +++ b/3rdparty/openpgm-svn-r1135-0002-correct-checksum-calculation.patch @@ -0,0 +1,17 @@ +Problem: OpenPGM may calculate incorrect checksums when sending RDATA packets + if no ODATA packet has been sent before. When and why this + happens exactly is unknown. +Solution: Always force recomputation of checksums until a more suitable + solution is found. + +--- openpgm-r1135-pristine/pgm/source.c 2010-09-09 03:24:47.000000000 +0200 ++++ openpgm-svn-r1135/pgm/source.c 2010-09-30 18:32:04.000000000 +0200 +@@ -2295,7 +2295,7 @@ + header->pgm_checksum = 0; + const size_t pgm_header_len = tpdu_length - ntohs(header->pgm_tsdu_length); + uint32_t unfolded_header = pgm_csum_partial (header, pgm_header_len, 0); +- uint32_t unfolded_odata = pgm_txw_get_unfolded_checksum (skb); ++ uint32_t unfolded_odata = pgm_csum_partial (skb->data, ntohs(header->pgm_tsdu_length), 0); + header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, unfolded_odata, pgm_header_len)); + + /* congestion control */ diff --git a/3rdparty/openpgm-svn-r1135-0003-fix-rdata-congestion-control.patch b/3rdparty/openpgm-svn-r1135-0003-fix-rdata-congestion-control.patch new file mode 100644 index 0000000..c6e721d --- /dev/null +++ b/3rdparty/openpgm-svn-r1135-0003-fix-rdata-congestion-control.patch @@ -0,0 +1,42 @@ +Problem: When enough lost data accumulates, RDATA packets are sent at + a massively reduced rate and block the congestion control + window for subsequent RDATA packets. This results in a + transmission rate of close to zero for up to 15 seconds in + experiments. +Solution: Allow sending of RDATA packets even when congestion control + would normally disallow it, but still consume a token if + there is one left. + +diff -Naur openpgm-r1135-pristine/pgm/source.c openpgm-svn-r1135/pgm/source.c +--- openpgm-r1135-pristine/pgm/source.c 2010-09-09 03:24:47.000000000 +0200 ++++ openpgm-svn-r1135/pgm/source.c 2010-09-24 17:40:12.000000000 +0200 +@@ -2299,13 +2299,13 @@ + header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, unfolded_odata, pgm_header_len)); + + /* congestion control */ +- if (sock->use_pgmcc && +- sock->tokens < pgm_fp8 (1)) +- { ++// if (sock->use_pgmcc && ++// sock->tokens < pgm_fp8 (1)) ++// { + // pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("Token limit reached.")); +- sock->blocklen = tpdu_length; +- return FALSE; +- } ++// sock->blocklen = tpdu_length; ++// return FALSE; ++// } + + const ssize_t sent = pgm_sendto (sock, + sock->is_controlled_rdata, /* rate limited */ +@@ -2323,7 +2323,8 @@ + const pgm_time_t now = pgm_time_update_now(); + + if (sock->use_pgmcc) { +- sock->tokens -= pgm_fp8 (1); ++ if (sock->tokens >= pgm_fp8 (1)) ++ sock->tokens -= pgm_fp8 (1); + sock->ack_expiry = now + sock->ack_expiry_ivl; + } + diff --git a/3rdparty/openpgm-svn-r1085/doc/draft-ietf-rmt-bb-pgmcc-03.txt b/3rdparty/openpgm-svn-r1135/doc/draft-ietf-rmt-bb-pgmcc-03.txt index 6f1869c..6f1869c 100644 --- a/3rdparty/openpgm-svn-r1085/doc/draft-ietf-rmt-bb-pgmcc-03.txt +++ b/3rdparty/openpgm-svn-r1135/doc/draft-ietf-rmt-bb-pgmcc-03.txt diff --git a/3rdparty/openpgm-svn-r1085/doc/rfc3208.txt b/3rdparty/openpgm-svn-r1135/doc/rfc3208.txt index fb82c26..fb82c26 100644 --- a/3rdparty/openpgm-svn-r1085/doc/rfc3208.txt +++ b/3rdparty/openpgm-svn-r1135/doc/rfc3208.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/COPYING b/3rdparty/openpgm-svn-r1135/pgm/COPYING index 5ab7695..5ab7695 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/COPYING +++ b/3rdparty/openpgm-svn-r1135/pgm/COPYING diff --git a/3rdparty/openpgm-svn-r1085/pgm/INSTALL b/3rdparty/openpgm-svn-r1135/pgm/INSTALL index 3ba60e5..3ba60e5 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/INSTALL +++ b/3rdparty/openpgm-svn-r1135/pgm/INSTALL diff --git a/3rdparty/openpgm-svn-r1085/pgm/LICENSE b/3rdparty/openpgm-svn-r1135/pgm/LICENSE index fabbeef..fabbeef 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/LICENSE +++ b/3rdparty/openpgm-svn-r1135/pgm/LICENSE diff --git a/3rdparty/openpgm-svn-r1085/pgm/README b/3rdparty/openpgm-svn-r1135/pgm/README index ece7aa1..ece7aa1 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/README +++ b/3rdparty/openpgm-svn-r1135/pgm/README diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgm b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgm index 8dd509d..2aaa3ce 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgm +++ b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgm @@ -149,9 +149,10 @@ if env['WITH_CHECK'] == 'true': te.Program (['socket_unittest.c', e.Object('if.c'), e.Object('tsi.c')] + tframework); -# te.Program (['source_unittest.c'] + tframework); -# te.Program (['receiver_unittest.c', -# e.Object('tsi.c')] + tframework); + te.Program (['source_unittest.c', + e.Object('skbuff.c')] + tframework); + te.Program (['receiver_unittest.c', + e.Object('tsi.c')] + tframework); te.Program (['recv_unittest.c', e.Object('tsi.c'), e.Object('gsi.c'), diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgm89 b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgm89 index dae46b9..5092157 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgm89 +++ b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgm89 @@ -62,7 +62,7 @@ e.Depends ('version.c', src); src += ['version.c']; # C89 degrading -c89source = Builder(action = 'perl -p -e "s/%z(u|d)/%l\\1/g" $SOURCE > $TARGET', +c89source = Builder(action = 'cp $SOURCE $TARGET && if test -f "${SOURCE}.c89.patch"; then patch -i ${SOURCE}.c89.patch $TARGET; fi', suffix = '.c89.c', src_suffix = '.c', single_source = 1); @@ -72,6 +72,9 @@ c89src = [] for c99file in src: c89file = c99file.replace('.c', '.c89.c'); c89src += [ c89file ]; + patchFile = c99file + '.c89.patch'; + if os.path.exists (patchFile): + e.Depends (c89file, patchFile); e.C89Source(c99file); e.StaticLibrary('libpgm89', c89src); diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgmex b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgmex index b508a04..b508a04 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgmex +++ b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgmex diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgmhttp b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgmhttp index 9824b3c..9824b3c 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgmhttp +++ b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgmhttp diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgmsnmp b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgmsnmp index 8e35aab..8e35aab 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConscript.libpgmsnmp +++ b/3rdparty/openpgm-svn-r1135/pgm/SConscript.libpgmsnmp diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct b/3rdparty/openpgm-svn-r1135/pgm/SConstruct index 5754901..1187ef9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct @@ -231,8 +231,17 @@ if env['WITH_SNMP'] == 'true': def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -241,7 +250,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.097 b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.097 index 9a1d029..12e058a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.097 +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.097 @@ -90,6 +90,7 @@ env = Environment(ENV = os.environ, # C99 '-std=gnu99', '-D_XOPEN_SOURCE=600', + '-D_BSD_SOURCE', # re-entrant libc '-D_REENTRANT', # '-DCONFIG_HAVE_GETPROTOBYNAME_R', @@ -212,15 +213,22 @@ if env['WITH_HTTP'] == 'true' and env['WITH_HISTOGRAMS'] == 'true': env.Append(CCFLAGS = '-DCONFIG_HISTOGRAMS'); # managed environment for libpgmsnmp, libpgmhttp -env['SNMP_FLAGS'] = { - 'CCFLAGS' : [], - 'LIBS' : [ 'netsnmpagent', 'netsnmpmibs', 'netsnmphelpers', 'netsnmp' ], -}; +if env['WITH_SNMP'] == 'true': + env['SNMP_FLAGS'] = env.ParseFlags('!net-snmp-config --cflags --agent-libs'); def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -229,7 +237,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; @@ -261,15 +279,8 @@ if env['WITH_SNMP'] == 'true': conf = Configure(env, custom_tests = tests); if env['WITH_SNMP'] == 'true' and not conf.CheckSNMP(): - print 'Enabling extra Red Hat dependencies for Net-SNMP.'; - conf.env['SNMP_FLAGS']['LIBS'].append(['librpm', 'libsensors', 'libdl', 'libwrap']); - lastLIBS = conf.env['LIBS']; - conf.env.ParseConfig('perl -MExtUtils::Embed -e ldopts'); - conf.env['SNMP_FLAGS']['LIBS'].append(conf.env['LIBS']); - conf.env.Replace(LIBS = lastLIBS); - if not conf.CheckSNMP(): - print 'Net-SNMP libraries not compatible.'; - Exit(1); + print 'Net-SNMP libraries not compatible.'; + Exit(1); if env['WITH_CHECK'] == 'true' and conf.CheckCheck(): print 'Enabling Check unit tests.'; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.097.intelc b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.097.intelc index e2099d5..337432a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.097.intelc +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.097.intelc @@ -89,15 +89,60 @@ env = Environment(ENV = os.environ, # '-Wmissing-format-attribute', # '-Wredundant-decls', # '-Wnested-externs', - '-Winline', +# Verbose inlining reports +# '-Winline', + +# 175: subscript out of range +# - Ignored for broken compiler C99 support +# e.g. tbuf[ sizeof(tbuf) ] = '\0'; + '-wd175', + +# 177: function was declared but never referenced +# - Ignored as side effect of portability pre-processor blocks. + '-wd177', + +# 181: argument is incompatible with corresponding format string conversion +# - Ignored as pre-processor fails to parse variadic printf style macros. + '-wd181', + +# 191: type qualifier is meaningless on cast type +# - Ignored as cast required for portability +# e.g. pgm_txw_state_t*const state = (pgm_txw_state_t*const)&skb->cb; + '-wd191', + +# 269: invalid format string conversion +# - Ignored with failure to display PRIu32 with (volatile uint32_t) + '-wd269', + +# 556: cannot assign to an entity of type "void *" +# - Ignored, it's a C++2003 error, valid in C99 aside of const down-converting. +# e.g. const char *s = ""; void *p = s; + '-wd556', + +# 589: transfer of control bypasses initialization +# - Ignored, it's a C++2003 error, perfectly valid in C99. + '-wd589', + +# 593: variable was set but never used +# '-wd593', + # 981: operands are evaluated in unspecified order +# - Ignored as pedantic warning against possible side effects. +# e.g. printf ("%s.%s > ", +# pgm_gethostbyaddr((const struct in_addr*)&ip->ip_src), +# pgm_udpport_string(pgm_header->pgm_sport)); '-wd981', -# 2259: non-pointer conversion from "*" to "*" may lose significant bits - '-wd2259', + +# 2259: non-pointer conversion from "/type a/" to "/type b/" may lose significant bits +# - Ignored for really pedantic compiler temporary value conversions, +# e.g. uint16_t j = 1, i = ~j; + '-wd2259', + # '-pedantic', # C99 '-std=c99', '-D_XOPEN_SOURCE=600', + '-D_BSD_SOURCE', '-gcc-version=420', # re-entrant libc '-D_REENTRANT', @@ -120,7 +165,8 @@ env = Environment(ENV = os.environ, '-DCONFIG_HAVE_BACKTRACE', # timing '-DCONFIG_HAVE_PSELECT', - '-DCONFIG_HAVE_RTC', +# ioctl RTC_IRQP_SET: undefined reference to `__invalid_size_argument_for_IOC' +# '-DCONFIG_HAVE_RTC', '-DCONFIG_HAVE_TSC', # event handling '-DCONFIG_HAVE_POLL', @@ -184,7 +230,7 @@ release = env.Clone(BUILD = 'release') release.Append(CCFLAGS = '-O2') debug = env.Clone(BUILD = 'debug') -debug.Append(CCFLAGS = ['-DPGM_DEBUG','-ggdb'], LINKFLAGS = '-gdb') +debug.Append(CCFLAGS = ['-DPGM_DEBUG','-ggdb'], LINKFLAGS = '-ggdb') profile = env.Clone(BUILD = 'profile') profile.Append(CCFLAGS = ['-O0','-pg'], LINKFLAGS = '-pg') @@ -222,15 +268,22 @@ if env['WITH_HTTP'] == 'true' and env['WITH_HISTOGRAMS'] == 'true': env.Append(CCFLAGS = '-DCONFIG_HISTOGRAMS'); # managed environment for libpgmsnmp, libpgmhttp -env['SNMP_FLAGS'] = { - 'CCFLAGS' : [], - 'LIBS' : [ 'netsnmpagent', 'netsnmpmibs', 'netsnmphelpers', 'netsnmp' ], -}; +if env['WITH_SNMP'] == 'true': + env['SNMP_FLAGS'] = env.ParseFlags('!net-snmp-config --cflags --agent-libs'); def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -239,7 +292,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; @@ -271,15 +334,8 @@ if env['WITH_SNMP'] == 'true': conf = Configure(env, custom_tests = tests); if env['WITH_SNMP'] == 'true' and not conf.CheckSNMP(): - print 'Enabling extra Red Hat dependencies for Net-SNMP.'; - conf.env['SNMP_FLAGS']['LIBS'].append(['librpm', 'libsensors', 'libdl', 'libwrap']); - lastLIBS = conf.env['LIBS']; - conf.env.ParseConfig('perl -MExtUtils::Embed -e ldopts'); - conf.env['SNMP_FLAGS']['LIBS'].append(conf.env['LIBS']); - conf.env.Replace(LIBS = lastLIBS); - if not conf.CheckSNMP(): - print 'Net-SNMP libraries not compatible.'; - Exit(1); + print 'Net-SNMP libraries not compatible.'; + Exit(1); if env['WITH_CHECK'] == 'true' and conf.CheckCheck(): print 'Enabling Check unit tests.'; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.097.mingw64 b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.097.mingw64 index 59b8063..a3ffec9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.097.mingw64 +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.097.mingw64 @@ -1,4 +1,4 @@ -# -*- mode: python -*- +# -*- coding: utf-8 mode: python -*- # OpenPGM build script import platform @@ -93,9 +93,10 @@ env = Environment(ENV = os.environ, '-Wnested-externs', '-Winline', '-pedantic', -# C99 '-std=gnu99', - '-D_GNU_SOURCE', +# ¡C89, not C99! +# '-std=gnu89', + '-D_BSD_SOURCE', '-D_WIN32_WINNT=0x0501', # re-entrant libc '-D_REENTRANT', @@ -223,8 +224,17 @@ env['SNMP_FLAGS'] = { def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -233,7 +243,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; @@ -265,15 +285,8 @@ if env['WITH_SNMP'] == 'true': conf = Configure(env, custom_tests = tests); if env['WITH_SNMP'] == 'true' and not conf.CheckSNMP(): - print 'Enabling extra Red Hat dependencies for Net-SNMP.'; - conf.env['SNMP_FLAGS']['LIBS'].append(['librpm', 'libsensors', 'libdl', 'libwrap']); - lastLIBS = conf.env['LIBS']; - conf.env.ParseConfig('perl -MExtUtils::Embed -e ldopts'); - conf.env['SNMP_FLAGS']['LIBS'].append(conf.env['LIBS']); - conf.env.Replace(LIBS = lastLIBS); - if not conf.CheckSNMP(): - print 'Net-SNMP libraries not compatible.'; - Exit(1); + print 'Net-SNMP libraries not compatible.'; + Exit(1); if env['WITH_CHECK'] == 'true' and conf.CheckCheck(): print 'Enabling Check unit tests.'; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.097.sunstudio b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.097.sunstudio index 1664b9b..86323d5 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.097.sunstudio +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.097.sunstudio @@ -202,16 +202,33 @@ if env['WITH_GETTEXT'] == 'true': if env['WITH_HTTP'] == 'true' and env['WITH_HISTOGRAMS'] == 'true': env.Append(CCFLAGS = '-DCONFIG_HISTOGRAMS'); +def list_remove(list, target): + newlist = []; + for item in str(list).split(' '): + if item != target: + newlist.append(item); + return newlist; + # managed environment for libpgmsnmp, libpgmhttp -env['SNMP_FLAGS'] = { - 'CCFLAGS' : [], - 'LIBS' : [ 'netsnmpagent', 'netsnmpmibs', 'netsnmphelpers', 'netsnmp' ], -}; +if env['WITH_SNMP'] == 'true': + env['SNMP_FLAGS'] = env.ParseFlags('!net-snmp-config --cflags --agent-libs'); +# strip out GCC only flags + ccflags = env['SNMP_FLAGS'].get('CCFLAGS', ''); + env['SNMP_FLAGS']['CCFLAGS'] = list_remove(ccflags, '-Wall'); def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -220,7 +237,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; @@ -252,15 +279,8 @@ if env['WITH_SNMP'] == 'true': conf = Configure(env, custom_tests = tests); if env['WITH_SNMP'] == 'true' and not conf.CheckSNMP(): - print 'Enabling extra Red Hat dependencies for Net-SNMP.'; - conf.env['SNMP_FLAGS']['LIBS'].append(['librpm', 'libsensors', 'libdl', 'libwrap']); - lastLIBS = conf.env['LIBS']; - conf.env.ParseConfig('perl -MExtUtils::Embed -e ldopts'); - conf.env['SNMP_FLAGS']['LIBS'].append(conf.env['LIBS']); - conf.env.Replace(LIBS = lastLIBS); - if not conf.CheckSNMP(): - print 'Net-SNMP libraries not compatible.'; - Exit(1); + print 'Net-SNMP libraries not compatible.'; + Exit(1); if env['WITH_CHECK'] == 'true' and conf.CheckCheck(): print 'Enabling Check unit tests.'; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.Debian4 b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.Debian4 index 952013e..952013e 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.Debian4 +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.Debian4 diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.FreeBSD80 b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.FreeBSD80 index 4d2b9a5..62b49f7 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.FreeBSD80 +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.FreeBSD80 @@ -228,15 +228,26 @@ if env['WITH_HTTP'] == 'true' and env['WITH_HISTOGRAMS'] == 'true': env.Append(CCFLAGS = '-DCONFIG_HISTOGRAMS'); # managed environment for libpgmsnmp, libpgmhttp -env['SNMP_FLAGS'] = { - 'CCFLAGS' : [], - 'LIBS' : [ 'netsnmpagent', 'netsnmpmibs', 'netsnmphelpers', 'netsnmp' ], -}; +if env['WITH_SNMP'] == 'true': + env['SNMP_FLAGS'] = env.ParseFlags('!net-snmp-config --cflags --agent-libs'); + +def restore_env(env, backup): + for var in backup.keys(): + env[var] = backup[var]; def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -245,7 +256,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; @@ -277,15 +298,8 @@ if env['WITH_SNMP'] == 'true': conf = Configure(env, custom_tests = tests); if env['WITH_SNMP'] == 'true' and not conf.CheckSNMP(): - print 'Enabling extra Red Hat dependencies for Net-SNMP.'; - conf.env['SNMP_FLAGS']['LIBS'].append(['librpm', 'libsensors', 'libdl', 'libwrap']); - lastLIBS = conf.env['LIBS']; - conf.env.ParseConfig('perl -MExtUtils::Embed -e ldopts'); - conf.env['SNMP_FLAGS']['LIBS'].append(conf.env['LIBS']); - conf.env.Replace(LIBS = lastLIBS); - if not conf.CheckSNMP(): - print 'Net-SNMP libraries not compatible.'; - Exit(1); + print 'Net-SNMP libraries not compatible.'; + Exit(1); if env['WITH_CHECK'] == 'true' and conf.CheckCheck(): print 'Enabling Check unit tests.'; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.OpenSolaris b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.OpenSolaris index c9833ed..c9833ed 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.OpenSolaris +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.OpenSolaris diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.RHEL4 b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.RHEL4 index 1637ea5..1637ea5 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.RHEL4 +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.RHEL4 diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.Solaris.gcc64 b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.Solaris.gcc64 index 953e120..01508dd 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.Solaris.gcc64 +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.Solaris.gcc64 @@ -236,19 +236,35 @@ if env['WITH_GETTEXT'] == 'true': if env['WITH_HTTP'] == 'true' and env['WITH_HISTOGRAMS'] == 'true': env.Append(CCFLAGS = '-DCONFIG_HISTOGRAMS'); +def list_remove(list, target): + newlist = []; + for item in str(list).split(' '): + if item != target: + newlist.append(item); + return newlist; + # managed environment for libpgmsnmp, libpgmhttp -env['SNMP_FLAGS'] = { - 'CCFLAGS' : [], - 'LIBS' : [ 'netsnmpagent', 'netsnmpmibs', 'netsnmphelpers', 'netsnmp', - 'ssl', 'kstat', 'wrap', 'adm' ], - 'CPPPATH' : ['/opt/cws/include'], - 'LIBPATH' : ['/opt/csw/lib'], -}; +if env['WITH_SNMP'] == 'true': +# net-snmp-config is broken in Solaris 10 and requires two separate calls + env['SNMP_FLAGS'] = env.ParseFlags(['!net-snmp-config-64 --cflags', + '!net-snmp-config-64 --agent-libs']); +# GCC error: language arch=v9 not recognized + ccflags = env['SNMP_FLAGS'].get('CCFLAGS', ''); + env['SNMP_FLAGS']['CCFLAGS'] = list_remove(ccflags, '-xarch=v9'); def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -257,7 +273,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.Solaris.sungcc b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.Solaris.sungcc index a5be81f..9d50481 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.Solaris.sungcc +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.Solaris.sungcc @@ -234,18 +234,24 @@ if env['WITH_HTTP'] == 'true' and env['WITH_HISTOGRAMS'] == 'true': env.Append(CCFLAGS = '-DCONFIG_HISTOGRAMS'); # managed environment for libpgmsnmp, libpgmhttp -env['SNMP_FLAGS'] = { - 'CCFLAGS' : [], - 'LIBS' : [ 'netsnmpagent', 'netsnmpmibs', 'netsnmphelpers', 'netsnmp', - 'ssl', 'kstat', 'wrap', 'adm' ], - 'CPPPATH' : ['/opt/cws/include'], - 'LIBPATH' : ['/opt/csw/lib'], -}; +if env['WITH_SNMP'] == 'true': +# net-snmp-config is broken in Solaris 10 and requires two separate calls + env['SNMP_FLAGS'] = env.ParseFlags(['!net-snmp-config-32 --cflags', + '!net-snmp-config-32 --agent-libs']); def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -254,7 +260,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.Solaris.sunstudio b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.Solaris.sunstudio index 435d907..0144291 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.Solaris.sunstudio +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.Solaris.sunstudio @@ -219,18 +219,24 @@ if env['WITH_HTTP'] == 'true' and env['WITH_HISTOGRAMS'] == 'true': env.Append(CCFLAGS = '-DCONFIG_HISTOGRAMS'); # managed environment for libpgmsnmp, libpgmhttp -env['SNMP_FLAGS'] = { - 'CCFLAGS' : [], - 'LIBS' : [ 'netsnmpagent', 'netsnmpmibs', 'netsnmphelpers', 'netsnmp', - 'ssl', 'kstat', 'wrap', 'adm' ], - 'CPPPATH' : ['/opt/cws/include'], - 'LIBPATH' : ['/opt/csw/lib'], -}; +if env['WITH_SNMP'] == 'true': +# net-snmp-config is broken in Solaris 10 and requires two separate calls + env['SNMP_FLAGS'] = env.ParseFlags(['!/usr/sfw/bin/net-snmp-config-64 --cflags', + '!/usr/sfw/bin/net-snmp-config-64 --agent-libs']); def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -239,7 +245,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.clang b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.clang index 7f0a54a..beed2db 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.clang +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.clang @@ -109,6 +109,8 @@ env = Environment( # '-pedantic', # C99 '-std=gnu99', + '-D_XOPEN_SOURCE=600', + '-D_BSD_SOURCE', # re-entrant libc '-D_REENTRANT', # '-DCONFIG_HAVE_GETPROTOBYNAME_R', @@ -116,6 +118,8 @@ env = Environment( # variadic macros '-DCONFIG_HAVE_ISO_VARARGS', # '-DCONFIG_HAVE_GNUC_VARARGS', +# stack memory api header + '-DCONFIG_HAVE_ALLOCA_H', # optimium checksum implementation # '-DCONFIG_8BIT_CHECKSUM', '-DCONFIG_16BIT_CHECKSUM', @@ -143,7 +147,8 @@ env = Environment( '-DCONFIG_HAVE_MCAST_JOIN', '-DCONFIG_HAVE_IP_MREQN', # sprintf - '-DCONFIG_HAVE_SPRINTF_GROUPING', +# NB: raises invalid conversion specifier ''' [-Wformat] in clang +# '-DCONFIG_HAVE_SPRINTF_GROUPING', '-DCONFIG_HAVE_VASPRINTF', # symbol linking scope '-DCONFIG_HAVE_DSO_VISIBILITY', @@ -227,15 +232,22 @@ if env['WITH_HTTP'] == 'true' and env['WITH_HISTOGRAMS'] == 'true': env.Append(CCFLAGS = '-DCONFIG_HISTOGRAMS'); # managed environment for libpgmsnmp, libpgmhttp -env['SNMP_FLAGS'] = { - 'CCFLAGS' : [], - 'LIBS' : [ 'netsnmpagent', 'netsnmpmibs', 'netsnmphelpers', 'netsnmp' ], -}; +if env['WITH_SNMP'] == 'true': + env['SNMP_FLAGS'] = env.ParseFlags('!net-snmp-config --cflags --agent-libs'); def CheckSNMP(context): context.Message('Checking Net-SNMP...'); - lastLIBS = context.env['LIBS']; - lastCCFLAGS= context.env['CCFLAGS']; +# backup = context.env.Clone().Dictionary(); + lastASFLAGS = context.env.get('ASFLAGS', ''); + lastCCFLAGS = context.env.get('CCFLAGS', ''); + lastCFLAGS = context.env.get('CFLAGS', ''); + lastCPPDEFINES = context.env.get('CPPDEFINES', ''); + lastCPPFLAGS = context.env.get('CPPFLAGS', ''); + lastCPPPATH = context.env.get('CPPPATH', ''); + lastLIBPATH = context.env.get('LIBPATH', ''); + lastLIBS = context.env.get('LIBS', ''); + lastLINKFLAGS = context.env.get('LINKFLAGS', ''); + lastRPATH = context.env.get('RPATH', ''); context.env.MergeFlags(env['SNMP_FLAGS']); result = context.TryLink(""" int main(int argc, char**argv) @@ -244,7 +256,17 @@ int main(int argc, char**argv) return 0; } """, '.c'); - context.env.Replace(LIBS = lastLIBS, CCFLAGS=lastCCFLAGS); +# context.env.Replace(**backup); + context.env.Replace(ASFLAGS = lastASFLAGS, + CCFLAGS = lastCCFLAGS, + CFLAGS = lastCFLAGS, + CPPDEFINES = lastCPPDEFINES, + CPPFLAGS = lastCPPFLAGS, + CPPPATH = lastCPPPATH, + LIBPATH = lastLIBPATH, + LIBS = lastLIBS, + LINKFLAGS = lastLINKFLAGS, + RPATH = lastRPATH); context.Result(not result); return result; @@ -276,15 +298,8 @@ if env['WITH_SNMP'] == 'true': conf = Configure(env, custom_tests = tests); if env['WITH_SNMP'] == 'true' and not conf.CheckSNMP(): - print 'Enabling extra Red Hat dependencies for Net-SNMP.'; - conf.env['SNMP_FLAGS']['LIBS'].append(['librpm', 'libsensors', 'libdl', 'libwrap']); - lastLIBS = conf.env['LIBS']; - conf.env.ParseConfig('perl -MExtUtils::Embed -e ldopts'); - conf.env['SNMP_FLAGS']['LIBS'].append(conf.env['LIBS']); - conf.env.Replace(LIBS = lastLIBS); - if not conf.CheckSNMP(): - print 'Net-SNMP libraries not compatible.'; - Exit(1); + print 'Net-SNMP libraries not compatible.'; + Exit(1); if env['WITH_CHECK'] == 'true' and conf.CheckCheck(): print 'Enabling Check unit tests.'; diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.mingw b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.mingw index 5f54704..c896256 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.mingw +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.mingw @@ -109,7 +109,7 @@ env = Environment( '-pedantic', # C99 '-std=gnu99', - '-D_GNU_SOURCE', + '-D_BSD_SOURCE', '-D_WIN32_WINNT=0x0501', # re-entrant libc '-D_REENTRANT', @@ -231,7 +231,8 @@ if env['WITH_HTTP'] == 'true' and env['WITH_HISTOGRAMS'] == 'true': # managed environment for libpgmsnmp, libpgmhttp if env['WITH_SNMP'] == 'true': - env['SNMP_FLAGS'] = env.ParseFlags('-Iwin/include -Lwin/lib -lnetsnmpagent -lnetsnmphelpers -lnetsnmp'); +# no command line helper, so hard code + env['SNMP_FLAGS'] = env.ParseFlags('-Iwin/include -Lwin/lib -lnetsnmpagent -lnetsnmphelpers -lnetsnmpmibs -lnetsnmp'); def CheckSNMP(context): context.Message('Checking Net-SNMP...'); diff --git a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.mingw-wine b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.mingw-wine index 6af1e0a..6af1e0a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/SConstruct.mingw-wine +++ b/3rdparty/openpgm-svn-r1135/pgm/SConstruct.mingw-wine diff --git a/3rdparty/openpgm-svn-r1085/pgm/atomic_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/atomic_unittest.c index a301c28..a301c28 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/atomic_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/atomic_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/backtrace.c b/3rdparty/openpgm-svn-r1135/pgm/backtrace.c index 2e9943d..86a3cd0 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/backtrace.c +++ b/3rdparty/openpgm-svn-r1135/pgm/backtrace.c @@ -21,11 +21,11 @@ #ifdef CONFIG_HAVE_BACKTRACE # include <stdio.h> -# include <stdlib.h> # include <execinfo.h> # include <sys/types.h> # include <unistd.h> #endif +#include <stdlib.h> #include <glib.h> #include <pgm/backtrace.h> diff --git a/3rdparty/openpgm-svn-r1085/pgm/checksum.c b/3rdparty/openpgm-svn-r1135/pgm/checksum.c index 959aceb..5e367ea 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/checksum.c +++ b/3rdparty/openpgm-svn-r1135/pgm/checksum.c @@ -123,7 +123,7 @@ do_csum_16bit ( remainder = 0; if (PGM_UNLIKELY(len == 0)) - return acc; + return (uint16_t)acc; is_odd = ((uintptr_t)buf & 1); /* align first byte */ if (PGM_UNLIKELY(is_odd)) { @@ -155,7 +155,7 @@ do_csum_16bit ( acc += (acc >> 16); if (PGM_UNLIKELY(is_odd)) acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); - return acc; + return (uint16_t)acc; } static @@ -180,7 +180,7 @@ do_csumcpy_16bit ( remainder = 0; if (PGM_UNLIKELY(len == 0)) - return acc; + return (uint16_t)acc; is_odd = ((uintptr_t)srcbuf & 1); /* align first byte */ if (PGM_UNLIKELY(is_odd)) { @@ -214,7 +214,7 @@ do_csumcpy_16bit ( acc += (acc >> 16); if (PGM_UNLIKELY(is_odd)) acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); - return acc; + return (uint16_t)acc; } static @@ -236,7 +236,7 @@ do_csum_32bit ( remainder = 0; if (PGM_UNLIKELY(len == 0)) - return acc; + return (uint16_t)acc; is_odd = ((uintptr_t)buf & 1); /* align first byte */ if (PGM_UNLIKELY(is_odd)) { @@ -282,7 +282,7 @@ do_csum_32bit ( acc += (acc >> 16); if (PGM_UNLIKELY(is_odd)) acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); - return acc; + return (uint16_t)acc; } static @@ -307,7 +307,7 @@ do_csumcpy_32bit ( remainder = 0; if (PGM_UNLIKELY(len == 0)) - return acc; + return (uint16_t)acc; is_odd = ((uintptr_t)srcbuf & 1); /* align first byte */ if (PGM_UNLIKELY(is_odd)) { @@ -356,7 +356,7 @@ do_csumcpy_32bit ( acc += (acc >> 16); if (PGM_UNLIKELY(is_odd)) acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); - return acc; + return (uint16_t)acc; } /* best if architecture has native 64-bit words @@ -381,7 +381,7 @@ do_csum_64bit ( remainder = 0; if (PGM_UNLIKELY(len == 0)) - return acc; + return (uint16_t)acc; is_odd = ((uintptr_t)buf & 1); /* align first byte */ if (PGM_UNLIKELY(is_odd)) { @@ -444,7 +444,7 @@ do_csum_64bit ( acc += (acc >> 16); if (PGM_UNLIKELY(is_odd)) acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); - return acc; + return (uint16_t)acc; } static @@ -469,7 +469,7 @@ do_csumcpy_64bit ( remainder = 0; if (PGM_UNLIKELY(len == 0)) - return acc; + return (uint16_t)acc; is_odd = ((uintptr_t)srcbuf & 1); /* align first byte */ if (PGM_UNLIKELY(is_odd)) { @@ -578,7 +578,7 @@ do_csumcpy_64bit ( acc += (acc >> 16); if (PGM_UNLIKELY(is_odd)) acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); - return acc; + return (uint16_t)acc; } #if defined(__amd64) || defined(__x86_64__) @@ -604,7 +604,7 @@ do_csum_vector ( remainder = 0; if (PGM_UNLIKELY(len == 0)) - return acc; + return (uint16_t)acc; /* align first byte */ is_odd = ((uintptr_t)buf & 1); if (PGM_UNLIKELY(is_odd)) { @@ -669,7 +669,7 @@ do_csum_vector ( acc += (acc >> 16); if (PGM_UNLIKELY(is_odd)) acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); - return acc; + return (uint16_t)acc; } static @@ -694,7 +694,7 @@ do_csumcpy_vector ( remainder = 0; if (PGM_UNLIKELY(len == 0)) - return acc; + return (uint16_t)acc; /* fill cache line with source buffer, invalidate destination buffer, * perversly for testing high temporal locality is better than no locality, * whilst in production no locality may be preferred depending on skb re-use. @@ -810,7 +810,7 @@ do_csumcpy_vector ( acc += (acc >> 16); if (PGM_UNLIKELY(is_odd)) acc = ((acc & 0xff) << 8) | ((acc & 0xff00) >> 8); - return acc; + return (uint16_t)acc; } #endif @@ -917,7 +917,7 @@ pgm_csum_fold ( csum += (csum >> 16); /* handle special case of no checksum */ - return csum == 0xffff ? csum : ~csum; + return (uint16_t)(csum == 0xffff ? csum : ~csum); } /* Add together two unfolded checksum accumulators diff --git a/3rdparty/openpgm-svn-r1085/pgm/checksum_perftest.c b/3rdparty/openpgm-svn-r1135/pgm/checksum_perftest.c index 678a066..678a066 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/checksum_perftest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/checksum_perftest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/checksum_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/checksum_unittest.c index a25d36a..a25d36a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/checksum_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/checksum_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/crossmingw.py b/3rdparty/openpgm-svn-r1135/pgm/crossmingw.py index 2981506..2981506 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/crossmingw.py +++ b/3rdparty/openpgm-svn-r1135/pgm/crossmingw.py diff --git a/3rdparty/openpgm-svn-r1085/pgm/crossmingw64.py b/3rdparty/openpgm-svn-r1135/pgm/crossmingw64.py index 111e0ed..111e0ed 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/crossmingw64.py +++ b/3rdparty/openpgm-svn-r1135/pgm/crossmingw64.py diff --git a/3rdparty/openpgm-svn-r1085/pgm/engine.c b/3rdparty/openpgm-svn-r1135/pgm/engine.c index 994bca2..dbe50b4 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/engine.c +++ b/3rdparty/openpgm-svn-r1135/pgm/engine.c @@ -19,6 +19,11 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* getprotobyname_r */ +#ifndef _BSD_SOURCE +# define _BSD_SOURCE 1 +#endif + #ifndef _WIN32 # include <netdb.h> #endif diff --git a/3rdparty/openpgm-svn-r1135/pgm/engine.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/engine.c.c89.patch new file mode 100644 index 0000000..30021c2 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/engine.c.c89.patch @@ -0,0 +1,58 @@ +--- engine.c 2010-05-23 15:43:35.000000000 +0800 ++++ engine.c89 2010-08-04 10:30:53.000000000 +0800 +@@ -85,6 +85,7 @@ + pgm_rand_init(); + + #ifdef _WIN32 ++ { + WORD wVersionRequested = MAKEWORD (2, 2); + WSADATA wsaData; + if (WSAStartup (wVersionRequested, &wsaData) != 0) +@@ -142,6 +143,7 @@ + closesocket (sock); + } + # endif ++ } + #endif /* _WIN32 */ + + /* find PGM protocol id overriding default value, use first value from NIS */ +@@ -168,6 +170,7 @@ + } + } + #else ++ { + const struct protoent *proto = getprotobyname ("pgm"); + if (proto != NULL) { + if (proto->p_proto != pgm_ipproto_pgm) { +@@ -181,9 +184,11 @@ + pgm_ipproto_pgm = proto->p_proto; + } + } ++ } + #endif + + /* ensure timing enabled */ ++ { + pgm_error_t* sub_error = NULL; + if (!pgm_time_init (&sub_error)) { + if (sub_error) +@@ -193,9 +198,11 @@ + #endif + goto err_shutdown; + } ++ } + + /* receiver simulated loss rate */ + #ifdef PGM_DEBUG ++ { + const char *loss_rate = getenv ("PGM_LOSS_RATE"); + if (NULL != loss_rate) { + int value = atoi (loss_rate); +@@ -204,6 +211,7 @@ + pgm_minor (_("Setting PGM packet loss rate to %i%%."), pgm_loss_rate); + } + } ++ } + #endif + + /* create global sock list lock */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/engine_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/engine_unittest.c index f434e35..13b448c 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/engine_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/engine_unittest.c @@ -19,6 +19,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* getprotobyname_r */ +#define _BSD_SOURCE 1 #include <signal.h> #include <stdbool.h> diff --git a/3rdparty/openpgm-svn-r1085/pgm/error.c b/3rdparty/openpgm-svn-r1135/pgm/error.c index 3f3fe30..3f3fe30 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/error.c +++ b/3rdparty/openpgm-svn-r1135/pgm/error.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/error_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/error_unittest.c index 035c0f3..035c0f3 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/error_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/error_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/SConscript b/3rdparty/openpgm-svn-r1135/pgm/examples/SConscript index 46ebce3..46ebce3 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/SConscript +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/SConscript diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/SConscript89 b/3rdparty/openpgm-svn-r1135/pgm/examples/SConscript89 index 5595d3d..5595d3d 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/SConscript89 +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/SConscript89 diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/async.c b/3rdparty/openpgm-svn-r1135/pgm/examples/async.c index 042bf8e..9ac15dd 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/async.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/async.c @@ -152,10 +152,10 @@ receiver_routine ( socklen_t socklen = sizeof(int); recvEvent = WSACreateEvent (); - pgm_getsockopt (async->sock, PGM_RECV_SOCK, &recv_sock, &socklen); + pgm_getsockopt (async->sock, IPPROTO_PGM, PGM_RECV_SOCK, &recv_sock, &socklen); WSAEventSelect (recv_sock, recvEvent, FD_READ); pendingEvent = WSACreateEvent (); - pgm_getsockopt (async->sock, PGM_PENDING_SOCK, &pending_sock, &socklen); + pgm_getsockopt (async->sock, IPPROTO_PGM, PGM_PENDING_SOCK, &pending_sock, &socklen); WSAEventSelect (pending_sock, pendingEvent, FD_READ); waitHandles[0] = async->destroy_event; @@ -185,13 +185,13 @@ receiver_routine ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (async->sock, PGM_TIME_REMAIN, &tv, &optlen); + pgm_getsockopt (async->sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (async->sock, PGM_RATE_REMAIN, &tv, &optlen); + pgm_getsockopt (async->sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } case PGM_IO_STATUS_WOULD_BLOCK: /* select for next event */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/async.h b/3rdparty/openpgm-svn-r1135/pgm/examples/async.h index 788a777..788a777 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/async.h +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/async.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/blocksyncrecv.c b/3rdparty/openpgm-svn-r1135/pgm/examples/blocksyncrecv.c index ec43d17..dec87be 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/blocksyncrecv.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/blocksyncrecv.c @@ -213,8 +213,8 @@ on_startup (void) g_error ("socket: %s", pgm_err->message); goto err_abort; } - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); } else { g_message ("create PGM/IP socket."); if (!pgm_socket (&g_sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -225,7 +225,7 @@ on_startup (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (g_sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -240,17 +240,17 @@ on_startup (void) nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (g_sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (g_sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (g_sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (g_sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (g_sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PASSIVE, &passive, sizeof(passive)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); /* create global session identifier */ struct pgm_sockaddr_t addr; @@ -284,8 +284,8 @@ on_startup (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (g_sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (g_sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -294,11 +294,11 @@ on_startup (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (g_sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (g_sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (g_sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (g_sock, PGM_NOBLOCK, &blocking, sizeof(blocking)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NOBLOCK, &blocking, sizeof(blocking)); if (!pgm_connect (g_sock, &pgm_err)) { g_error ("connecting PGM socket: %s", pgm_err->message); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/daytime.c b/3rdparty/openpgm-svn-r1135/pgm/examples/daytime.c index dda619b..52779a9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/daytime.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/daytime.c @@ -301,8 +301,8 @@ create_sock (void) fprintf (stderr, "Creating PGM/UDP socket: %s\n", pgm_err->message); goto err_abort; } - pgm_setsockopt (sock, PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); - pgm_setsockopt (sock, PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); } else { if (!pgm_socket (&sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { fprintf (stderr, "Creating PGM/IP socket: %s\n", pgm_err->message); @@ -312,7 +312,7 @@ create_sock (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -329,12 +329,12 @@ create_sock (void) pgm_secs (25), pgm_secs (30) }; - pgm_setsockopt (sock, PGM_SEND_ONLY, &send_only, sizeof(send_only)); - pgm_setsockopt (sock, PGM_MTU, &max_tpdu, sizeof(max_tpdu)); - pgm_setsockopt (sock, PGM_TXW_SQNS, &sqns, sizeof(sqns)); - pgm_setsockopt (sock, PGM_TXW_MAX_RTE, &max_rte, sizeof(max_rte)); - pgm_setsockopt (sock, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); - pgm_setsockopt (sock, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_SEND_ONLY, &send_only, sizeof(send_only)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MTU, &max_tpdu, sizeof(max_tpdu)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_TXW_SQNS, &sqns, sizeof(sqns)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_TXW_MAX_RTE, &max_rte, sizeof(max_rte)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); #ifdef I_UNDERSTAND_PGMCC_AND_FEC_ARE_NOT_SUPPORTED if (use_pgmcc) { @@ -342,7 +342,7 @@ create_sock (void) pgmccinfo.ack_bo_ivl = pgm_msecs (50); pgmccinfo.ack_c = 75; pgmccinfo.ack_c_p = 500; - pgm_setsockopt (sock, PGM_USE_PGMCC, &pgmccinfo, sizeof(pgmccinfo)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_USE_PGMCC, &pgmccinfo, sizeof(pgmccinfo)); } if (use_fec) { struct pgm_fecinfo_t fecinfo; @@ -351,7 +351,7 @@ create_sock (void) fecinfo.group_size = rs_k; fecinfo.ondemand_parity_enabled = use_ondemand_parity; fecinfo.var_pktlen_enabled = TRUE; - pgm_setsockopt (sock, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); } #endif @@ -387,8 +387,8 @@ create_sock (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -397,11 +397,11 @@ create_sock (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); if (!pgm_connect (sock, &pgm_err)) { fprintf (stderr, "Connecting PGM socket: %s\n", pgm_err->message); @@ -471,13 +471,13 @@ nak_routine ( socklen_t socklen = sizeof(int); recvEvent = WSACreateEvent (); - pgm_getsockopt (nak_sock, PGM_RECV_SOCK, &recv_sock, &socklen); + pgm_getsockopt (nak_sock, IPPROTO_PGM, PGM_RECV_SOCK, &recv_sock, &socklen); WSAEventSelect (recv_sock, recvEvent, FD_READ); repairEvent = WSACreateEvent (); - pgm_getsockopt (nak_sock, PGM_REPAIR_SOCK, &repair_sock, &socklen); + pgm_getsockopt (nak_sock, IPPROTO_PGM, PGM_REPAIR_SOCK, &repair_sock, &socklen); WSAEventSelect (repair_sock, repairEvent, FD_READ); pendingEvent = WSACreateEvent (); - pgm_getsockopt (nak_sock, PGM_PENDING_SOCK, &pending_sock, &socklen); + pgm_getsockopt (nak_sock, IPPROTO_PGM, PGM_PENDING_SOCK, &pending_sock, &socklen); WSAEventSelect (pending_sock, pendingEvent, FD_READ); waitHandles[0] = terminate_event; @@ -494,13 +494,13 @@ nak_routine ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (sock, PGM_TIME_REMAIN, &tv, &optlen); + pgm_getsockopt (sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (sock, PGM_RATE_REMAIN, &tv, &optlen); + pgm_getsockopt (sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } case PGM_IO_STATUS_WOULD_BLOCK: block: diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/enonblocksyncrecv.c b/3rdparty/openpgm-svn-r1135/pgm/examples/enonblocksyncrecv.c index 27625ce..3f24f76 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/enonblocksyncrecv.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/enonblocksyncrecv.c @@ -168,13 +168,13 @@ main ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_TIME_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_RATE_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: @@ -245,8 +245,8 @@ on_startup (void) g_error ("socket: %s", pgm_err->message); goto err_abort; } - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); } else { g_message ("create PGM/IP socket."); if (!pgm_socket (&g_sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -257,7 +257,7 @@ on_startup (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (g_sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -272,17 +272,17 @@ on_startup (void) nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (g_sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (g_sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (g_sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (g_sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (g_sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PASSIVE, &passive, sizeof(passive)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); /* create global session identifier */ struct pgm_sockaddr_t addr; @@ -316,8 +316,8 @@ on_startup (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (g_sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (g_sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -326,11 +326,11 @@ on_startup (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (g_sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (g_sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (g_sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (g_sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); if (!pgm_connect (g_sock, &pgm_err)) { g_error ("connecting PGM socket: %s", pgm_err->message); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/enonblocksyncrecvmsg.c b/3rdparty/openpgm-svn-r1135/pgm/examples/enonblocksyncrecvmsg.c index 9a0e9c6..43deb89 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/enonblocksyncrecvmsg.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/enonblocksyncrecvmsg.c @@ -163,13 +163,13 @@ main ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_TIME_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_RATE_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: @@ -240,8 +240,8 @@ on_startup (void) g_error ("socket: %s", pgm_err->message); goto err_abort; } - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); } else { g_message ("create PGM/IP socket."); if (!pgm_socket (&g_sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -252,7 +252,7 @@ on_startup (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (g_sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -267,17 +267,17 @@ on_startup (void) nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (g_sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (g_sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (g_sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (g_sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (g_sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PASSIVE, &passive, sizeof(passive)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); /* create global session identifier */ struct pgm_sockaddr_t addr; @@ -311,8 +311,8 @@ on_startup (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (g_sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (g_sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -321,11 +321,11 @@ on_startup (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (g_sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (g_sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (g_sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (g_sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); if (!pgm_connect (g_sock, &pgm_err)) { g_error ("connecting PGM socket: %s", pgm_err->message); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/enonblocksyncrecvmsgv.c b/3rdparty/openpgm-svn-r1135/pgm/examples/enonblocksyncrecvmsgv.c index 0a04056..f41a002 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/enonblocksyncrecvmsgv.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/enonblocksyncrecvmsgv.c @@ -170,13 +170,13 @@ main ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_TIME_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_RATE_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: @@ -247,8 +247,8 @@ on_startup (void) g_error ("socket: %s", pgm_err->message); goto err_abort; } - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); } else { g_message ("create PGM/IP socket."); if (!pgm_socket (&g_sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -259,7 +259,7 @@ on_startup (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (g_sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -274,17 +274,17 @@ on_startup (void) nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (g_sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (g_sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (g_sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (g_sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (g_sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PASSIVE, &passive, sizeof(passive)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); /* create global session identifier */ struct pgm_sockaddr_t addr; @@ -318,8 +318,8 @@ on_startup (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (g_sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (g_sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -328,11 +328,11 @@ on_startup (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (g_sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (g_sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (g_sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (g_sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); if (!pgm_connect (g_sock, &pgm_err)) { g_error ("connecting PGM socket: %s", pgm_err->message); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/getopt.c b/3rdparty/openpgm-svn-r1135/pgm/examples/getopt.c index 8c655b6..8c655b6 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/getopt.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/getopt.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/getopt.h b/3rdparty/openpgm-svn-r1135/pgm/examples/getopt.h index f04387b..f04387b 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/getopt.h +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/getopt.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmdump.c b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmdump.c index b91b804..481b12e 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmdump.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmdump.c @@ -131,7 +131,7 @@ on_startup ( /* find PGM protocol id */ // TODO: fix valgrind errors int ipproto_pgm = IPPROTO_PGM; -#if HAVE_GETPROTOBYNAME_R +#ifdef HAVE_GETPROTOBYNAME_R char b[1024]; struct protoent protobuf, *proto; e = getprotobyname_r ("pgm", &protobuf, b, sizeof(b), &proto); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmping.cc b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmping.cc index 38ac560..0c7e702 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmping.cc +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmping.cc @@ -410,8 +410,14 @@ on_startup ( g_error ("socket: %s", pgm_err->message); goto err_abort; } - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port))) { + g_error ("setting PGM_UDP_ENCAP_UCAST_PORT = %d", g_udp_encap_port); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port))) { + g_error ("setting PGM_UDP_ENCAP_MCAST_PORT = %d", g_udp_encap_port); + goto err_abort; + } } else { g_message ("create PGM/IP socket."); if (!pgm_socket (&g_sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -423,17 +429,42 @@ on_startup ( /* Use RFC 2113 tagging for PGM Router Assist */ { const int no_router_assist = 0; - pgm_setsockopt (g_sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist))) { + g_error ("setting PGM_IP_ROUTER_ALERT = %d", no_router_assist); + goto err_abort; + } } pgm_drop_superuser(); /* set PGM parameters */ - if (PGMPING_MODE_SOURCE == g_mode || +/* common */ + { + const int bufsize = 1024 * 1024, + max_tpdu = g_max_tpdu; + + if (!pgm_setsockopt (g_sock, SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof(bufsize))) { + g_error ("setting SO_RCVBUF = %d", bufsize); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof(bufsize))) { + g_error ("setting SO_SNDBUF = %d", bufsize); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MTU, &max_tpdu, sizeof(max_tpdu))) { + g_error ("setting PGM_MTU = %d", max_tpdu); + goto err_abort; + } + } + +/* send side */ + if (PGMPING_MODE_SOURCE == g_mode || PGMPING_MODE_INITIATOR == g_mode || - PGMPING_MODE_REFLECTOR == g_mode) + PGMPING_MODE_REFLECTOR == g_mode ) { - const int send_only = PGMPING_MODE_SOURCE == g_mode ? 1 : 0, + const int send_only = (PGMPING_MODE_SOURCE == g_mode) ? 1 : 0, + txw_sqns = g_sqns * 4, + txw_max_rte = g_max_rte, ambient_spm = pgm_secs (30), heartbeat_spm[] = { pgm_msecs (100), pgm_msecs (100), @@ -445,19 +476,44 @@ on_startup ( pgm_secs (25), pgm_secs (30) }; - pgm_setsockopt (g_sock, PGM_SEND_ONLY, &send_only, sizeof(send_only)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_TXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_TXW_MAX_RTE, &g_max_rte, sizeof(g_max_rte)); - pgm_setsockopt (g_sock, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); - pgm_setsockopt (g_sock, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_ONLY, &send_only, sizeof(send_only))) { + g_error ("setting PGM_SEND_ONLY = %d", send_only); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TXW_SQNS, &txw_sqns, sizeof(txw_sqns))) { + g_error ("setting PGM_TXW_SQNS = %d", txw_sqns); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TXW_MAX_RTE, &txw_max_rte, sizeof(txw_max_rte))) { + g_error ("setting PGM_TXW_MAX_RTE = %d", txw_max_rte); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm))) { + g_error ("setting PGM_AMBIENT_SPM = %d", ambient_spm); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm))) { + char buffer[1024]; + sprintf (buffer, "%d", heartbeat_spm[0]); + for (unsigned i = 1; i < G_N_ELEMENTS(heartbeat_spm); i++) { + char t[1024]; + sprintf (t, ", %d", heartbeat_spm[i]); + strcat (buffer, t); + } + g_error ("setting HEARTBEAT_SPM = { %s }", buffer); + goto err_abort; + } + } - if (PGMPING_MODE_RECEIVER == g_mode || + +/* receive side */ + if (PGMPING_MODE_RECEIVER == g_mode || PGMPING_MODE_INITIATOR == g_mode || - PGMPING_MODE_REFLECTOR == g_mode) + PGMPING_MODE_REFLECTOR == g_mode ) { - const int recv_only = PGMPING_MODE_RECEIVER == g_mode ? 1 : 0, - passive = 0, + const int recv_only = (PGMPING_MODE_RECEIVER == g_mode) ? 1 : 0, + not_passive = 0, + rxw_sqns = g_sqns, peer_expiry = pgm_secs (300), spmr_expiry = pgm_msecs (250), nak_bo_ivl = pgm_msecs (50), @@ -466,17 +522,46 @@ on_startup ( nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (g_sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (g_sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (g_sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (g_sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (g_sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only))) { + g_error ("setting PGM_RECV_ONLY = %d", recv_only); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PASSIVE, ¬_passive, sizeof(not_passive))) { + g_error ("setting PGM_PASSIVE = %d", not_passive); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RXW_SQNS, &rxw_sqns, sizeof(rxw_sqns))) { + g_error ("setting PGM_RXW_SQNS = %d", rxw_sqns); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry))) { + g_error ("setting PGM_PEER_EXPIRY = %d", peer_expiry); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry))) { + g_error ("setting PGM_SPMR_EXPIRY = %d", spmr_expiry); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl))) { + g_error ("setting PGM_NAK_BO_IVL = %d", nak_bo_ivl); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl))) { + g_error ("setting PGM_NAK_RPT_IVL = %d", nak_rpt_ivl); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl))) { + g_error ("setting PGM_NAK_RDATA_IVL = %d", nak_rdata_ivl); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries))) { + g_error ("setting PGM_NAK_DATA_RETRIES = %d", nak_data_retries); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries))) { + g_error ("setting PGM_NAK_NCF_RETRIES = %d", nak_ncf_retries); + goto err_abort; + } } #ifdef I_UNDERSTAND_PGMCC_AND_FEC_ARE_NOT_SUPPORTED @@ -486,7 +571,13 @@ on_startup ( pgmccinfo.ack_bo_ivl = pgm_msecs (50); pgmccinfo.ack_c = 75; pgmccinfo.ack_c_p = 500; - pgm_setsockopt (g_sock, PGM_USE_PGMCC, &pgmccinfo, sizeof(pgmccinfo)); + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_USE_PGMCC, &pgmccinfo, sizeof(pgmccinfo))) { + g_error ("setting PGM_USE_PGMCC = { ack_bo_ivl = %d ack_c = %d ack_c_p = %d }", + pgmccinfo.ack_bo_ivl, + pgmccinfo.ack_c, + pgmccinfo.ack_c_p); + goto err_abort; + } } /* Reed Solomon forward error correction */ @@ -497,14 +588,22 @@ on_startup ( fecinfo.group_size = g_rs_k; fecinfo.ondemand_parity_enabled = TRUE; fecinfo.var_pktlen_enabled = TRUE; - pgm_setsockopt (g_sock, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_USE_FEC, &fecinfo, sizeof(fecinfo))) { + g_error ("setting PGM_USE_FEC = { block_size = %d proactive_packets = %d group_size = %d ondemand_parity_enabled = %s var_pktlen_enabled = %s }", + fecinfo.block_size, + fecinfo.proactive_packets, + fecinfo.group_size, + fecinfo.ondemand_parity_enabled ? "TRUE" : "FALSE", + fecinfo.var_pktlen_enabled ? "TRUE" : "FALSE"); + goto err_abort; + } } #endif /* create global session identifier */ struct pgm_sockaddr_t addr; memset (&addr, 0, sizeof(addr)); - addr.sa_port = g_port ? g_port : DEFAULT_DATA_DESTINATION_PORT; + addr.sa_port = (0 != g_port) ? g_port : DEFAULT_DATA_DESTINATION_PORT; addr.sa_addr.sport = DEFAULT_DATA_SOURCE_PORT; if (!pgm_gsi_create_from_hostname (&addr.sa_addr.gsi, &pgm_err)) { g_error ("creating GSI: %s", pgm_err->message); @@ -533,22 +632,57 @@ on_startup ( /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (g_sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (g_sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + { + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req))) { + char group[INET6_ADDRSTRLEN]; + getnameinfo ((struct sockaddr*)&res->ai_recv_addrs[i].gsr_group, sizeof(struct sockaddr_in), + group, sizeof(group), + NULL, 0, + NI_NUMERICHOST); + g_error ("setting PGM_JOIN_GROUP = { #%u %s }", + (unsigned)res->ai_recv_addrs[i].gsr_interface, + group); + goto err_abort; + } + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req))) { + char group[INET6_ADDRSTRLEN]; + getnameinfo ((struct sockaddr*)&res->ai_send_addrs[0].gsr_group, sizeof(struct sockaddr_in), + group, sizeof(group), + NULL, 0, + NI_NUMERICHOST); + g_error ("setting PGM_SEND_GROUP = { #%u %s }", + (unsigned)res->ai_send_addrs[0].gsr_interface, + group); + goto err_abort; + } pgm_freeaddrinfo (res); /* set IP parameters */ { - const int nonblocking = 1, - multicast_loop = 0, - multicast_hops = 16, - dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - - pgm_setsockopt (g_sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (g_sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); - if (AF_INET6 != sa_family) - pgm_setsockopt (g_sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (g_sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + const int nonblocking = 1, + multicast_direct = 0, + multicast_hops = 16, + dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ + + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_direct, sizeof(multicast_direct))) { + g_error ("setting PGM_MULTICAST_LOOP = %d", multicast_direct); + goto err_abort; + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops))) { + g_error ("setting PGM_MULTICAST_HOPS = %d", multicast_hops); + goto err_abort; + } + if (AF_INET6 != sa_family) { + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp))) { + g_error ("setting PGM_TOS = 0x%x", dscp); + goto err_abort; + } + } + if (!pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking))) { + g_error ("setting PGM_NOBLOCK = %d", nonblocking); + goto err_abort; + } } if (!pgm_connect (g_sock, &pgm_err)) { @@ -709,7 +843,11 @@ again: case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (tx_sock, PGM_RATE_REMAIN, &tv, &optlen); + const gboolean status = pgm_getsockopt (tx_sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); + if (G_UNLIKELY(!status)) { + g_error ("getting PGM_RATE_REMAIN failed"); + break; + } timeout = (tv.tv_sec * 1000) + ((tv.tv_usec + 500) / 1000); /* busy wait under 2ms */ if (timeout < 2) timeout = 0; @@ -732,6 +870,7 @@ again: case PGM_IO_STATUS_WOULD_BLOCK: { #ifdef CONFIG_HAVE_EPOLL +# if 1 /* re-enable write event for one-shot */ if (pgm_epoll_ctl (tx_sock, efd_again, EPOLL_CTL_MOD, EPOLLOUT | EPOLLONESHOT) < 0) { @@ -742,6 +881,18 @@ again: const int ready = epoll_wait (efd_again, events, G_N_ELEMENTS(events), -1 /* ms */); if (G_UNLIKELY(g_quit)) break; +# else + const int ready = epoll_wait (efd_again, events, G_N_ELEMENTS(events), -1 /* ms */); + if (G_UNLIKELY(g_quit)) + break; + if (ready > 0 && + pgm_epoll_ctl (tx_sock, efd_again, EPOLL_CTL_MOD, EPOLLOUT | EPOLLONESHOT) < 0) + { + g_error ("pgm_epoll_ctl failed errno %i: \"%s\"", errno, strerror(errno)); + g_main_loop_quit (g_loop); + return NULL; + } +# endif #elif defined(CONFIG_HAVE_POLL) memset (fds, 0, sizeof(fds)); fds[0].fd = g_quit_pipe[0]; @@ -802,6 +953,7 @@ receiver_thread ( struct epoll_event event; memset (&event, 0, sizeof(event)); event.events = EPOLLIN; + event.data.fd = g_quit_pipe[0]; if (epoll_ctl (efd, EPOLL_CTL_ADD, g_quit_pipe[0], &event) < 0) { g_error ("epoll_ctl failed errno %i: \"%s\"", errno, strerror(errno)); g_main_loop_quit (g_loop); @@ -842,16 +994,27 @@ receiver_thread ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_TIME_REMAIN, &tv, &optlen); + const gboolean status = pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); +//g_message ("timer pending %d", ((tv.tv_sec * 1000) + (tv.tv_usec / 1000))); + if (G_UNLIKELY(!status)) { + g_error ("getting PGM_TIME_REMAIN failed"); + break; + } } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_RATE_REMAIN, &tv, &optlen); + const gboolean status = pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); +//g_message ("rate limited %d", ((tv.tv_sec * 1000) + (tv.tv_usec / 1000))); + if (G_UNLIKELY(!status)) { + g_error ("getting PGM_RATE_REMAIN failed"); + break; + } } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: +//g_message ("would block"); block: timeout = PGM_IO_STATUS_WOULD_BLOCK == status ? -1 : ((tv.tv_sec * 1000) + (tv.tv_usec / 1000)); /* busy wait under 2ms */ @@ -862,7 +1025,7 @@ block: memset (fds, 0, sizeof(fds)); fds[0].fd = g_quit_pipe[0]; fds[0].events = POLLIN; - pgm_transport_poll_info (g_transport, &fds[1], &n_fds, POLLIN); + pgm_poll_info (g_sock, &fds[1], &n_fds, POLLIN); poll (fds, 1 + n_fds, timeout /* ms */); #endif /* !CONFIG_HAVE_EPOLL */ break; @@ -920,8 +1083,11 @@ again: status = pgm_send (g_sock, pskb->data, pskb->len, NULL); switch (status) { case PGM_IO_STATUS_RATE_LIMITED: +g_message ("ratelimit"); goto again; case PGM_IO_STATUS_CONGESTION: +g_message ("congestion"); goto again; case PGM_IO_STATUS_WOULD_BLOCK: +g_message ("would block"); /* busy wait always as reflector */ goto again; diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmrecv.c b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmrecv.c index 035ccc4..eddbbc7 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmrecv.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmrecv.c @@ -325,8 +325,8 @@ on_startup ( g_error ("socket: %s", pgm_err->message); goto err_abort; } - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); } else { g_message ("create PGM/IP socket."); if (!pgm_socket (&g_sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -337,7 +337,7 @@ on_startup ( /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (g_sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -352,17 +352,17 @@ on_startup ( nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (g_sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (g_sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (g_sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (g_sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (g_sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PASSIVE, &passive, sizeof(passive)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); /* create global session identifier */ struct pgm_sockaddr_t addr; @@ -396,8 +396,8 @@ on_startup ( /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (g_sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (g_sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -406,11 +406,11 @@ on_startup ( multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (g_sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (g_sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (g_sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (g_sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); if (!pgm_connect (g_sock, &pgm_err)) { g_error ("connecting PGM socket: %s", pgm_err->message); @@ -549,13 +549,13 @@ receiver_thread ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (rx_sock, PGM_TIME_REMAIN, &tv, &optlen); + pgm_getsockopt (rx_sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (rx_sock, PGM_RATE_REMAIN, &tv, &optlen); + pgm_getsockopt (rx_sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmsend.c b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmsend.c index d8d3539..6fd85a1 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmsend.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmsend.c @@ -187,8 +187,8 @@ create_pgm_socket (void) g_error ("Creating PGM/UDP socket: %s", pgm_err->message); goto err_abort; } - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); } else { if (!pgm_socket (&g_sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { g_error ("Creating PGM/IP socket: %s", pgm_err->message); @@ -198,7 +198,7 @@ create_pgm_socket (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (g_sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -215,12 +215,12 @@ create_pgm_socket (void) pgm_secs (25), pgm_secs (30) }; - pgm_setsockopt (g_sock, PGM_SEND_ONLY, &send_only, sizeof(send_only)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_TXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_TXW_MAX_RTE, &g_max_rte, sizeof(g_max_rte)); - pgm_setsockopt (g_sock, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); - pgm_setsockopt (g_sock, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_ONLY, &send_only, sizeof(send_only)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TXW_SQNS, &g_sqns, sizeof(g_sqns)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TXW_MAX_RTE, &g_max_rte, sizeof(g_max_rte)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); if (g_fec) { struct pgm_fecinfo_t fecinfo; fecinfo.block_size = g_n; @@ -228,7 +228,7 @@ create_pgm_socket (void) fecinfo.group_size = g_k; fecinfo.ondemand_parity_enabled = TRUE; fecinfo.var_pktlen_enabled = TRUE; - pgm_setsockopt (g_sock, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); } /* create global session identifier */ @@ -263,8 +263,8 @@ create_pgm_socket (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (g_sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (g_sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -273,11 +273,11 @@ create_pgm_socket (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (g_sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (g_sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (g_sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (g_sock, PGM_NOBLOCK, &blocking, sizeof(blocking)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NOBLOCK, &blocking, sizeof(blocking)); if (!pgm_connect (g_sock, &pgm_err)) { g_error ("Connecting PGM socket: %s", pgm_err->message); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmtop.c b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmtop.c index 9b18310..9b18310 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/pgmtop.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/pgmtop.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/ping.proto b/3rdparty/openpgm-svn-r1135/pgm/examples/ping.proto index 8c6dfd1..8c6dfd1 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/ping.proto +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/ping.proto diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/pnonblocksyncrecv.c b/3rdparty/openpgm-svn-r1135/pgm/examples/pnonblocksyncrecv.c index f66454f..b5a2e13 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/pnonblocksyncrecv.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/pnonblocksyncrecv.c @@ -163,13 +163,13 @@ main ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_TIME_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_RATE_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: @@ -248,8 +248,8 @@ on_startup (void) g_error ("socket: %s", pgm_err->message); goto err_abort; } - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); } else { g_message ("create PGM/IP socket."); if (!pgm_socket (&g_sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -260,7 +260,7 @@ on_startup (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (g_sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -275,17 +275,17 @@ on_startup (void) nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (g_sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (g_sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (g_sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (g_sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (g_sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PASSIVE, &passive, sizeof(passive)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); /* create global session identifier */ struct pgm_sockaddr_t addr; @@ -319,8 +319,8 @@ on_startup (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (g_sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (g_sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -329,11 +329,11 @@ on_startup (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (g_sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (g_sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (g_sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (g_sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); if (!pgm_connect (g_sock, &pgm_err)) { g_error ("connecting PGM socket: %s", pgm_err->message); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/purinrecv.c b/3rdparty/openpgm-svn-r1135/pgm/examples/purinrecv.c index c5e4bd3..0ac38d9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/purinrecv.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/purinrecv.c @@ -28,7 +28,6 @@ # include <unistd.h> #else # include "getopt.h" -# define snprintf _snprintf #endif #include <pgm/pgm.h> @@ -109,7 +108,11 @@ main ( } /* parse program arguments */ - const char* binary_name = strrchr (argv[0], '/'); +#ifdef _WIN32 + const char* binary_name = strrchr (argv[0], '\\') + 1; +#else + const char* binary_name = strrchr (argv[0], '/') + 1; +#endif int c; while ((c = getopt (argc, argv, "s:n:p:cf:K:N:lih")) != -1) { @@ -168,10 +171,10 @@ main ( socklen_t socklen = sizeof(int); recvEvent = WSACreateEvent (); - pgm_getsockopt (sock, PGM_RECV_SOCK, &recv_sock, &socklen); + pgm_getsockopt (sock, IPPROTO_PGM, PGM_RECV_SOCK, &recv_sock, &socklen); WSAEventSelect (recv_sock, recvEvent, FD_READ); pendingEvent = WSACreateEvent (); - pgm_getsockopt (sock, PGM_PENDING_SOCK, &pending_sock, &socklen); + pgm_getsockopt (sock, IPPROTO_PGM, PGM_PENDING_SOCK, &pending_sock, &socklen); WSAEventSelect (pending_sock, pendingEvent, FD_READ); waitHandles[0] = terminate_event; @@ -200,13 +203,13 @@ main ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (sock, PGM_TIME_REMAIN, &tv, &optlen); + pgm_getsockopt (sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (sock, PGM_RATE_REMAIN, &tv, &optlen); + pgm_getsockopt (sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } case PGM_IO_STATUS_WOULD_BLOCK: /* select for next event */ @@ -312,8 +315,8 @@ on_startup (void) fprintf (stderr, "Creating PGM/UDP socket: %s\n", pgm_err->message); goto err_abort; } - pgm_setsockopt (sock, PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); - pgm_setsockopt (sock, PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); } else { puts ("Create PGM/IP socket."); if (!pgm_socket (&sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -324,7 +327,7 @@ on_startup (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -339,17 +342,17 @@ on_startup (void) nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (sock, PGM_MTU, &max_tpdu, sizeof(max_tpdu)); - pgm_setsockopt (sock, PGM_RXW_SQNS, &sqns, sizeof(sqns)); - pgm_setsockopt (sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_PASSIVE, &passive, sizeof(passive)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MTU, &max_tpdu, sizeof(max_tpdu)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_RXW_SQNS, &sqns, sizeof(sqns)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); #ifdef I_UNDERSTAND_PGMCC_AND_FEC_ARE_NOT_SUPPORTED if (use_pgmcc) { @@ -357,7 +360,7 @@ on_startup (void) pgmccinfo.ack_bo_ivl = pgm_msecs (50); pgmccinfo.ack_c = 75; pgmccinfo.ack_c_p = 500; - pgm_setsockopt (sock, PGM_USE_PGMCC, &pgmccinfo, sizeof(pgmccinfo)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_USE_PGMCC, &pgmccinfo, sizeof(pgmccinfo)); } if (use_fec) { struct pgm_fecinfo_t fecinfo; @@ -366,7 +369,7 @@ on_startup (void) fecinfo.group_size = rs_k; fecinfo.ondemand_parity_enabled = TRUE; fecinfo.var_pktlen_enabled = FALSE; - pgm_setsockopt (sock, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); } #endif @@ -402,8 +405,8 @@ on_startup (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -412,11 +415,11 @@ on_startup (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); if (!pgm_connect (sock, &pgm_err)) { fprintf (stderr, "Connecting PGM socket: %s\n", pgm_err->message); @@ -457,13 +460,15 @@ on_data ( /* protect against non-null terminated strings */ char buf[1024], tsi[PGM_TSISTRLEN]; const size_t buflen = MIN(sizeof(buf) - 1, len); +#ifndef _MSC_VER strncpy (buf, (const char*)data, buflen); buf[buflen] = '\0'; pgm_tsi_print_r (&from->sa_addr, tsi, sizeof(tsi)); -#ifndef _MSC_VER printf ("\"%s\" (%zu bytes from %s)\n", buf, len, tsi); #else + strncpy_s (buf, buflen, (const char*)data, _TRUNCATE); + pgm_tsi_print_r (&from->sa_addr, tsi, sizeof(tsi)); /* Microsoft CRT will crash on %zu */ printf ("\"%s\" (%u bytes from %s)\n", buf, (unsigned)len, tsi); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/purinrecvcc.cc b/3rdparty/openpgm-svn-r1135/pgm/examples/purinrecvcc.cc index 72c1d23..84631dd 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/purinrecvcc.cc +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/purinrecvcc.cc @@ -96,7 +96,7 @@ main ( { cpgm::pgm_error_t* pgm_err = NULL; - setlocale (LC_ALL, ""); + std::setlocale (LC_ALL, ""); #if !defined(_WIN32) || defined(CONFIG_TARGET_WINE) std::cout << "プリン プリン" << std::endl; @@ -140,13 +140,13 @@ main ( /* setup signal handlers */ #ifdef SIGHUP - signal (SIGHUP, SIG_IGN); + std::signal (SIGHUP, SIG_IGN); #endif #ifndef _WIN32 int e = pipe (terminate_pipe); assert (0 == e); - signal (SIGINT, on_signal); - signal (SIGTERM, on_signal); + std::signal (SIGINT, on_signal); + std::signal (SIGTERM, on_signal); #else terminate_event = CreateEvent (NULL, TRUE, FALSE, TEXT("TerminateEvent")); SetConsoleCtrlHandler ((PHANDLER_ROUTINE)on_console_ctrl, TRUE); @@ -169,10 +169,10 @@ main ( socklen_t socklen = sizeof(int); recvEvent = WSACreateEvent (); - sock->get_option (cpgm::PGM_RECV_SOCK, &recv_sock, &socklen); + sock->get_option (IPPROTO_PGM, cpgm::PGM_RECV_SOCK, &recv_sock, &socklen); WSAEventSelect (recv_sock, recvEvent, FD_READ); pendingEvent = WSACreateEvent (); - sock->get_option (cpgm::PGM_PENDING_SOCK, &pending_sock, &socklen); + sock->get_option (IPPROTO_PGM, cpgm::PGM_PENDING_SOCK, &pending_sock, &socklen); WSAEventSelect (pending_sock, pendingEvent, FD_READ); waitHandles[0] = terminate_event; @@ -198,11 +198,11 @@ main ( break; case cpgm::PGM_IO_STATUS_TIMER_PENDING: optlen = sizeof (tv); - sock->get_option (cpgm::PGM_TIME_REMAIN, &tv, &optlen); + sock->get_option (IPPROTO_PGM, cpgm::PGM_TIME_REMAIN, &tv, &optlen); goto block; case cpgm::PGM_IO_STATUS_RATE_LIMITED: optlen = sizeof (tv); - sock->get_option (cpgm::PGM_RATE_REMAIN, &tv, &optlen); + sock->get_option (IPPROTO_PGM, cpgm::PGM_RATE_REMAIN, &tv, &optlen); case cpgm::PGM_IO_STATUS_WOULD_BLOCK: /* select for next event */ block: @@ -309,8 +309,8 @@ on_startup (void) std::cerr << "Creating PGM/UDP socket: " << pgm_err->message << std::endl; goto err_abort; } - sock->set_option (cpgm::PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); - sock->set_option (cpgm::PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); } else { std::cout << "Create PGM/IP socket." << std::endl; if (!sock->open (sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -322,7 +322,7 @@ on_startup (void) { /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - sock->set_option (cpgm::PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); } cpgm::pgm_drop_superuser(); @@ -339,17 +339,17 @@ on_startup (void) nak_data_retries = 50, nak_ncf_retries = 50; - sock->set_option (cpgm::PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - sock->set_option (cpgm::PGM_PASSIVE, &passive, sizeof(passive)); - sock->set_option (cpgm::PGM_MTU, &max_tpdu, sizeof(max_tpdu)); - sock->set_option (cpgm::PGM_RXW_SQNS, &sqns, sizeof(sqns)); - sock->set_option (cpgm::PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - sock->set_option (cpgm::PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - sock->set_option (cpgm::PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - sock->set_option (cpgm::PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - sock->set_option (cpgm::PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - sock->set_option (cpgm::PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - sock->set_option (cpgm::PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_PASSIVE, &passive, sizeof(passive)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_MTU, &max_tpdu, sizeof(max_tpdu)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_RXW_SQNS, &sqns, sizeof(sqns)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); } if (use_fec) { struct cpgm::pgm_fecinfo_t fecinfo; @@ -358,7 +358,7 @@ on_startup (void) fecinfo.group_size = rs_k; fecinfo.ondemand_parity_enabled = TRUE; fecinfo.var_pktlen_enabled = FALSE; - sock->set_option (cpgm::PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); } /* create global session identifier */ @@ -372,8 +372,8 @@ on_startup (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - sock->set_option (cpgm::PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - sock->set_option (cpgm::PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); { @@ -383,10 +383,10 @@ on_startup (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - sock->set_option (cpgm::PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - sock->set_option (cpgm::PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); - sock->set_option (cpgm::PGM_TOS, &dscp, sizeof(dscp)); - sock->set_option (cpgm::PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_TOS, &dscp, sizeof(dscp)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); } if (!sock->connect (&pgm_err)) { diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/purinsend.c b/3rdparty/openpgm-svn-r1135/pgm/examples/purinsend.c index 811c14c..871c631 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/purinsend.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/purinsend.c @@ -26,7 +26,6 @@ # include <unistd.h> #else # include "getopt.h" -# define snprintf _snprintf #endif #include <pgm/pgm.h> @@ -91,7 +90,11 @@ main ( } /* parse program arguments */ - const char* binary_name = strrchr (argv[0], '/'); +#ifdef _WIN32 + const char* binary_name = strrchr (argv[0], '\\') + 1; +#else + const char* binary_name = strrchr (argv[0], '/') + 1; +#endif int c; while ((c = getopt (argc, argv, "s:n:p:r:f:K:N:lih")) != -1) { @@ -162,8 +165,8 @@ create_sock (void) fprintf (stderr, "Creating PGM/UDP socket: %s\n", pgm_err->message); goto err_abort; } - pgm_setsockopt (sock, PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); - pgm_setsockopt (sock, PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); } else { if (!pgm_socket (&sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { fprintf (stderr, "Creating PGM/IP socket: %s\n", pgm_err->message); @@ -173,7 +176,7 @@ create_sock (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -190,12 +193,12 @@ create_sock (void) pgm_secs (25), pgm_secs (30) }; - pgm_setsockopt (sock, PGM_SEND_ONLY, &send_only, sizeof(send_only)); - pgm_setsockopt (sock, PGM_MTU, &max_tpdu, sizeof(max_tpdu)); - pgm_setsockopt (sock, PGM_TXW_SQNS, &sqns, sizeof(sqns)); - pgm_setsockopt (sock, PGM_TXW_MAX_RTE, &max_rte, sizeof(max_rte)); - pgm_setsockopt (sock, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); - pgm_setsockopt (sock, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_SEND_ONLY, &send_only, sizeof(send_only)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MTU, &max_tpdu, sizeof(max_tpdu)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_TXW_SQNS, &sqns, sizeof(sqns)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_TXW_MAX_RTE, &max_rte, sizeof(max_rte)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); if (use_fec) { struct pgm_fecinfo_t fecinfo; fecinfo.block_size = rs_n; @@ -203,7 +206,7 @@ create_sock (void) fecinfo.group_size = rs_k; fecinfo.ondemand_parity_enabled = TRUE; fecinfo.var_pktlen_enabled = TRUE; - pgm_setsockopt (sock, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); } /* create global session identifier */ @@ -237,9 +240,10 @@ create_sock (void) } /* join IP multicast groups */ - for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + unsigned i; + for (i = 0; i < res->ai_recv_addrs_len; i++) + pgm_setsockopt (sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -248,11 +252,11 @@ create_sock (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (sock, PGM_NOBLOCK, &blocking, sizeof(blocking)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NOBLOCK, &blocking, sizeof(blocking)); if (!pgm_connect (sock, &pgm_err)) { fprintf (stderr, "Connecting PGM socket: %s\n", pgm_err->message); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/purinsendcc.cc b/3rdparty/openpgm-svn-r1135/pgm/examples/purinsendcc.cc index fe3c430..6ce9648 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/purinsendcc.cc +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/purinsendcc.cc @@ -85,7 +85,7 @@ main ( { cpgm::pgm_error_t* pgm_err = NULL; - setlocale (LC_ALL, ""); + std::setlocale (LC_ALL, ""); if (!cpgm::pgm_init (&pgm_err)) { std::cerr << "Unable to start PGM engine: " << pgm_err->message << std::endl; @@ -167,8 +167,8 @@ create_sock (void) std::cerr << "Creating PGM/UDP socket: " << pgm_err->message << std::endl; goto err_abort; } - sock->set_option (cpgm::PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); - sock->set_option (cpgm::PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); } else { if (!sock->open (sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { std::cerr << "Creating PGM/IP socket: " << pgm_err->message << std::endl; @@ -179,7 +179,7 @@ create_sock (void) { /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - sock->set_option (cpgm::PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); } cpgm::pgm_drop_superuser(); @@ -198,12 +198,12 @@ create_sock (void) pgm_secs (25), pgm_secs (30) }; - sock->set_option (cpgm::PGM_SEND_ONLY, &send_only, sizeof(send_only)); - sock->set_option (cpgm::PGM_MTU, &max_tpdu, sizeof(max_tpdu)); - sock->set_option (cpgm::PGM_TXW_SQNS, &sqns, sizeof(sqns)); - sock->set_option (cpgm::PGM_TXW_MAX_RTE, &max_rte, sizeof(max_rte)); - sock->set_option (cpgm::PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); - sock->set_option (cpgm::PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_SEND_ONLY, &send_only, sizeof(send_only)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_MTU, &max_tpdu, sizeof(max_tpdu)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_TXW_SQNS, &sqns, sizeof(sqns)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_TXW_MAX_RTE, &max_rte, sizeof(max_rte)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm)); } if (use_fec) { struct cpgm::pgm_fecinfo_t fecinfo; @@ -212,7 +212,7 @@ create_sock (void) fecinfo.group_size = rs_k; fecinfo.ondemand_parity_enabled = TRUE; fecinfo.var_pktlen_enabled = TRUE; - sock->set_option (cpgm::PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); } /* create global session identifier */ @@ -226,8 +226,8 @@ create_sock (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - sock->set_option (cpgm::PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - sock->set_option (cpgm::PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); cpgm::pgm_freeaddrinfo (res); { @@ -237,10 +237,10 @@ create_sock (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - sock->set_option (cpgm::PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - sock->set_option (cpgm::PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); - sock->set_option (cpgm::PGM_TOS, &dscp, sizeof(dscp)); - sock->set_option (cpgm::PGM_NOBLOCK, &blocking, sizeof(blocking)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_TOS, &dscp, sizeof(dscp)); + sock->set_option (IPPROTO_PGM, cpgm::PGM_NOBLOCK, &blocking, sizeof(blocking)); } if (!sock->connect (&pgm_err)) { diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/shortcakerecv.c b/3rdparty/openpgm-svn-r1135/pgm/examples/shortcakerecv.c index 87ce8dc..bcaec4a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/shortcakerecv.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/shortcakerecv.c @@ -277,8 +277,8 @@ on_startup (void) fprintf (stderr, "Creating PGM/UDP socket: %s\n", pgm_err->message); goto err_abort; } - pgm_setsockopt (sock, PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); - pgm_setsockopt (sock, PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &udp_encap_port, sizeof(udp_encap_port)); } else { if (!pgm_socket (&sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { fprintf (stderr, "Creating PGM/IP socket: %s\n", pgm_err->message); @@ -288,7 +288,7 @@ on_startup (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -303,17 +303,17 @@ on_startup (void) nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (sock, PGM_MTU, &max_tpdu, sizeof(max_tpdu)); - pgm_setsockopt (sock, PGM_RXW_SQNS, &sqns, sizeof(sqns)); - pgm_setsockopt (sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_PASSIVE, &passive, sizeof(passive)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MTU, &max_tpdu, sizeof(max_tpdu)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_RXW_SQNS, &sqns, sizeof(sqns)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); if (use_fec) { struct pgm_fecinfo_t fecinfo; fecinfo.block_size = rs_n; @@ -321,7 +321,7 @@ on_startup (void) fecinfo.group_size = rs_k; fecinfo.ondemand_parity_enabled = TRUE; fecinfo.var_pktlen_enabled = TRUE; - pgm_setsockopt (sock, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_USE_FEC, &fecinfo, sizeof(fecinfo)); } /* create global session identifier */ @@ -356,8 +356,8 @@ on_startup (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -366,11 +366,11 @@ on_startup (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); if (!pgm_connect (sock, &pgm_err)) { fprintf (stderr, "Connecting PGM socket: %s\n", pgm_err->message); diff --git a/3rdparty/openpgm-svn-r1085/pgm/examples/snonblocksyncrecv.c b/3rdparty/openpgm-svn-r1135/pgm/examples/snonblocksyncrecv.c index 434f72d..4d72b71 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/examples/snonblocksyncrecv.c +++ b/3rdparty/openpgm-svn-r1135/pgm/examples/snonblocksyncrecv.c @@ -184,13 +184,13 @@ main ( case PGM_IO_STATUS_TIMER_PENDING: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_TIME_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } goto block; case PGM_IO_STATUS_RATE_LIMITED: { socklen_t optlen = sizeof (tv); - pgm_getsockopt (g_sock, PGM_RATE_REMAIN, &tv, &optlen); + pgm_getsockopt (g_sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: @@ -298,8 +298,8 @@ on_startup (void) g_error ("socket: %s", pgm_err->message); goto err_abort; } - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); - pgm_setsockopt (g_sock, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_UCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_UDP_ENCAP_MCAST_PORT, &g_udp_encap_port, sizeof(g_udp_encap_port)); } else { g_message ("create PGM/IP socket."); if (!pgm_socket (&g_sock, sa_family, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { @@ -310,7 +310,7 @@ on_startup (void) /* Use RFC 2113 tagging for PGM Router Assist */ const int no_router_assist = 0; - pgm_setsockopt (g_sock, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist)); pgm_drop_superuser(); @@ -325,17 +325,17 @@ on_startup (void) nak_data_retries = 50, nak_ncf_retries = 50; - pgm_setsockopt (g_sock, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); - pgm_setsockopt (g_sock, PGM_PASSIVE, &passive, sizeof(passive)); - pgm_setsockopt (g_sock, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); - pgm_setsockopt (g_sock, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); - pgm_setsockopt (g_sock, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); - pgm_setsockopt (g_sock, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); - pgm_setsockopt (g_sock, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); - pgm_setsockopt (g_sock, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); - pgm_setsockopt (g_sock, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RECV_ONLY, &recv_only, sizeof(recv_only)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PASSIVE, &passive, sizeof(passive)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MTU, &g_max_tpdu, sizeof(g_max_tpdu)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_RXW_SQNS, &g_sqns, sizeof(g_sqns)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries)); /* create global session identifier */ struct pgm_sockaddr_t addr; @@ -369,8 +369,8 @@ on_startup (void) /* join IP multicast groups */ for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) - pgm_setsockopt (g_sock, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); - pgm_setsockopt (g_sock, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req)); pgm_freeaddrinfo (res); /* set IP parameters */ @@ -379,11 +379,11 @@ on_startup (void) multicast_hops = 16, dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ - pgm_setsockopt (g_sock, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); - pgm_setsockopt (g_sock, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &multicast_loop, sizeof(multicast_loop)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops)); if (AF_INET6 != sa_family) - pgm_setsockopt (g_sock, PGM_TOS, &dscp, sizeof(dscp)); - pgm_setsockopt (g_sock, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp)); + pgm_setsockopt (g_sock, IPPROTO_PGM, PGM_NOBLOCK, &nonblocking, sizeof(nonblocking)); if (!pgm_connect (g_sock, &pgm_err)) { g_error ("connecting PGM socket: %s", pgm_err->message); diff --git a/3rdparty/openpgm-svn-r1085/pgm/fec-block.txt b/3rdparty/openpgm-svn-r1135/pgm/fec-block.txt index 8278fb6..8278fb6 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/fec-block.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/fec-block.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/fec.txt b/3rdparty/openpgm-svn-r1135/pgm/fec.txt index b83590d..b83590d 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/fec.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/fec.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/galois_generator.pl b/3rdparty/openpgm-svn-r1135/pgm/galois_generator.pl index b3f531d..b3f531d 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/galois_generator.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/galois_generator.pl diff --git a/3rdparty/openpgm-svn-r1085/pgm/gcov-parse.pl b/3rdparty/openpgm-svn-r1135/pgm/gcov-parse.pl index b87a3f3..b87a3f3 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/gcov-parse.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/gcov-parse.pl diff --git a/3rdparty/openpgm-svn-r1085/pgm/gcov-seed.sh b/3rdparty/openpgm-svn-r1135/pgm/gcov-seed.sh index 853fbe6..853fbe6 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/gcov-seed.sh +++ b/3rdparty/openpgm-svn-r1135/pgm/gcov-seed.sh diff --git a/3rdparty/openpgm-svn-r1085/pgm/gcov.sh b/3rdparty/openpgm-svn-r1135/pgm/gcov.sh index ca17d62..ca17d62 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/gcov.sh +++ b/3rdparty/openpgm-svn-r1135/pgm/gcov.sh diff --git a/3rdparty/openpgm-svn-r1085/pgm/getifaddrs.c b/3rdparty/openpgm-svn-r1135/pgm/getifaddrs.c index 9db1d86..9db1d86 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/getifaddrs.c +++ b/3rdparty/openpgm-svn-r1135/pgm/getifaddrs.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/getifaddrs.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/getifaddrs.c.c89.patch new file mode 100644 index 0000000..d7e7c08 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/getifaddrs.c.c89.patch @@ -0,0 +1,218 @@ +--- getifaddrs.c 2010-07-03 20:31:27.000000000 +0800 ++++ getifaddrs.c89 2010-08-04 10:49:52.000000000 +0800 +@@ -507,7 +507,9 @@ + /* loop to handle interfaces coming online causing a buffer overflow + * between first call to list buffer length and second call to enumerate. + */ +- for (unsigned i = MAX_TRIES; i; i--) ++ { ++ unsigned i; ++ for (i = MAX_TRIES; i; i--) + { + pgm_debug ("IP_ADAPTER_INFO buffer length %lu bytes.", ulOutBufLen); + pAdapterInfo = (IP_ADAPTER_INFO*)_pgm_heap_alloc (ulOutBufLen); +@@ -519,6 +521,7 @@ + break; + } + } ++ } + + switch (dwRet) { + case ERROR_SUCCESS: /* NO_ERROR */ +@@ -543,12 +546,15 @@ + } + + /* count valid adapters */ ++ { + int n = 0, k = 0; + for (pAdapter = pAdapterInfo; + pAdapter; + pAdapter = pAdapter->Next) + { +- for (IP_ADDR_STRING *pIPAddr = &pAdapter->IpAddressList; ++ { ++ IP_ADDR_STRING *pIPAddr; ++ for (pIPAddr = &pAdapter->IpAddressList; + pIPAddr; + pIPAddr = pIPAddr->Next) + { +@@ -557,11 +563,13 @@ + continue; + ++n; + } ++ } + } + + pgm_debug ("GetAdaptersInfo() discovered %d interfaces.", n); + + /* contiguous block for adapter list */ ++ { + struct _pgm_ifaddrs_t* ifa = pgm_new0 (struct _pgm_ifaddrs_t, n); + struct _pgm_ifaddrs_t* ift = ifa; + +@@ -570,7 +578,9 @@ + pAdapter; + pAdapter = pAdapter->Next) + { +- for (IP_ADDR_STRING *pIPAddr = &pAdapter->IpAddressList; ++ { ++ IP_ADDR_STRING *pIPAddr; ++ for (pIPAddr = &pAdapter->IpAddressList; + pIPAddr; + pIPAddr = pIPAddr->Next) + { +@@ -586,8 +596,12 @@ + pgm_debug ("name:%s IPv4 index:%lu", + pAdapter->AdapterName, pAdapter->Index); + ift->_ifa.ifa_name = ift->_name; ++#ifdef _MSC_VER ++ strncpy_s (ift->_ifa.ifa_name, IF_NAMESIZE, pAdapter->AdapterName, _TRUNCATE); ++#else + strncpy (ift->_ifa.ifa_name, pAdapter->AdapterName, IF_NAMESIZE); + ift->_ifa.ifa_name[IF_NAMESIZE - 1] = 0; ++#endif + + /* flags: assume up, broadcast and multicast */ + ift->_ifa.ifa_flags = IFF_UP | IFF_BROADCAST | IFF_MULTICAST; +@@ -604,11 +618,14 @@ + ift = (struct _pgm_ifaddrs_t*)(ift->_ifa.ifa_next); + } + } ++ } + } + + if (pAdapterInfo) + free (pAdapterInfo); + *ifap = (struct pgm_ifaddrs_t*)ifa; ++ } ++ } + return TRUE; + } + +@@ -625,7 +642,9 @@ + /* loop to handle interfaces coming online causing a buffer overflow + * between first call to list buffer length and second call to enumerate. + */ +- for (unsigned i = MAX_TRIES; i; i--) ++ { ++ unsigned i; ++ for (i = MAX_TRIES; i; i--) + { + pgm_debug ("IP_ADAPTER_ADDRESSES buffer length %lu bytes.", dwSize); + pAdapterAddresses = (IP_ADAPTER_ADDRESSES*)_pgm_heap_alloc (dwSize); +@@ -645,6 +664,7 @@ + break; + } + } ++ } + + switch (dwRet) { + case ERROR_SUCCESS: +@@ -669,12 +689,15 @@ + } + + /* count valid adapters */ ++ { + int n = 0, k = 0; + for (adapter = pAdapterAddresses; + adapter; + adapter = adapter->Next) + { +- for (IP_ADAPTER_UNICAST_ADDRESS *unicast = adapter->FirstUnicastAddress; ++ { ++ IP_ADAPTER_UNICAST_ADDRESS *unicast; ++ for (unicast = adapter->FirstUnicastAddress; + unicast; + unicast = unicast->Next) + { +@@ -687,9 +710,11 @@ + + ++n; + } ++ } + } + + /* contiguous block for adapter list */ ++ { + struct _pgm_ifaddrs_t* ifa = pgm_new0 (struct _pgm_ifaddrs_t, n); + struct _pgm_ifaddrs_t* ift = ifa; + +@@ -699,7 +724,9 @@ + adapter = adapter->Next) + { + int unicastIndex = 0; +- for (IP_ADAPTER_UNICAST_ADDRESS *unicast = adapter->FirstUnicastAddress; ++ { ++ IP_ADAPTER_UNICAST_ADDRESS *unicast; ++ for (unicast = adapter->FirstUnicastAddress; + unicast; + unicast = unicast->Next, ++unicastIndex) + { +@@ -718,8 +745,12 @@ + pgm_debug ("name:%s IPv4 index:%lu IPv6 index:%lu", + adapter->AdapterName, adapter->IfIndex, adapter->Ipv6IfIndex); + ift->_ifa.ifa_name = ift->_name; ++#ifdef _MSC_VER ++ strncpy_s (ift->_ifa.ifa_name, IF_NAMESIZE, adapter->AdapterName, _TRUNCATE); ++#else + strncpy (ift->_ifa.ifa_name, adapter->AdapterName, IF_NAMESIZE); + ift->_ifa.ifa_name[IF_NAMESIZE - 1] = 0; ++#endif + + /* flags */ + ift->_ifa.ifa_flags = 0; +@@ -734,9 +765,12 @@ + ift->_ifa.ifa_netmask = (void*)&ift->_netmask; + + /* pre-Vista must hunt for matching prefix in linked list, otherwise use OnLinkPrefixLength */ ++ { + int prefixIndex = 0; + ULONG prefixLength = 0; +- for (IP_ADAPTER_PREFIX *prefix = adapter->FirstPrefix; ++ { ++ IP_ADAPTER_PREFIX *prefix; ++ for (prefix = adapter->FirstPrefix; + prefix; + prefix = prefix->Next, ++prefixIndex) + { +@@ -745,6 +779,7 @@ + break; + } + } ++ } + + /* map prefix to netmask */ + ift->_ifa.ifa_netmask->sa_family = unicast->Address.lpSockaddr->sa_family; +@@ -762,12 +797,16 @@ + pgm_warn (_("IPv6 adapter %s prefix length is 0, overriding to 128."), adapter->AdapterName); + prefixLength = 128; + } +- for (ULONG i = prefixLength, j = 0; i > 0; i -= 8, ++j) ++ { ++ ULONG i, j; ++ for (i = prefixLength, j = 0; i > 0; i -= 8, ++j) + { + ((struct sockaddr_in6*)ift->_ifa.ifa_netmask)->sin6_addr.s6_addr[ j ] = i >= 8 ? 0xff : (ULONG)(( 0xffU << ( 8 - i ) ) & 0xffU ); + } ++ } + break; + } ++ } + + /* next */ + if (k++ < (n - 1)) { +@@ -775,11 +814,14 @@ + ift = (struct _pgm_ifaddrs_t*)(ift->_ifa.ifa_next); + } + } ++ } + } + + if (pAdapterAddresses) + free (pAdapterAddresses); + *ifap = (struct pgm_ifaddrs_t*)ifa; ++ } ++ } + return TRUE; + } + #endif /* _WIN32 */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/getifaddrs_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/getifaddrs_unittest.c index 05063fe..1ab7378 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/getifaddrs_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/getifaddrs_unittest.c @@ -20,7 +20,7 @@ */ /* IFF_UP */ -#define _BSD_SOURCE +#define _BSD_SOURCE 1 #include <errno.h> #include <signal.h> diff --git a/3rdparty/openpgm-svn-r1085/pgm/getnodeaddr.c b/3rdparty/openpgm-svn-r1135/pgm/getnodeaddr.c index 0765c9f..0765c9f 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/getnodeaddr.c +++ b/3rdparty/openpgm-svn-r1135/pgm/getnodeaddr.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/getnodeaddr.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/getnodeaddr.c.c89.patch new file mode 100644 index 0000000..06db807 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/getnodeaddr.c.c89.patch @@ -0,0 +1,59 @@ +--- getnodeaddr.c 2010-05-21 11:35:15.000000000 +0800 ++++ getnodeaddr.c89 2010-08-05 13:17:31.000000000 +0800 +@@ -58,6 +58,7 @@ + pgm_debug ("pgm_if_getnodeaddr (family:%s addr:%p cnt:%d error:%p)", + pgm_family_string (family), (const void*)addr, cnt, (const void*)error); + ++ { + char hostname[NI_MAXHOST + 1]; + struct hostent* he; + +@@ -75,15 +76,22 @@ + return FALSE; + } + ++/* sa_family_t may be ADDRESS_FAMILY on Vista+ which is a USHORT, whilst ULONG ++ * on earlier targets. ++ */ ++#pragma warning( disable : 4244 ) + addr->sa_family = family; +- struct addrinfo hints = { +- .ai_family = family, +- .ai_socktype = SOCK_STREAM, /* not really */ +- .ai_protocol = IPPROTO_TCP, /* not really */ +- .ai_flags = AI_ADDRCONFIG, +- }, *res; ++#pragma warning( default : 4244 ) ++ { ++ int e; ++ struct addrinfo hints, *res; ++ memset (&hints, 0, sizeof(hints)); ++ hints.ai_family = family, ++ hints.ai_socktype = SOCK_STREAM, /* not really */ ++ hints.ai_protocol = IPPROTO_TCP, /* not really */ ++ hints.ai_flags = AI_ADDRCONFIG, + +- int e = getaddrinfo (hostname, NULL, &hints, &res); ++ e = getaddrinfo (hostname, NULL, &hints, &res); + if (0 == e) { + const socklen_t addrlen = res->ai_addrlen; + memcpy (addr, res->ai_addr, addrlen); +@@ -125,7 +133,9 @@ + ); + return FALSE; + } ++ } + ++ { + struct pgm_ifaddrs_t *ifap, *ifa, *ifa6; + if (!pgm_getifaddrs (&ifap, error)) { + pgm_prefix_error (error, +@@ -172,6 +182,8 @@ + + memcpy (addr, ifa6->ifa_addr, pgm_sockaddr_len (ifa6->ifa_addr)); + pgm_freeifaddrs (ifap); ++ } ++ } + return TRUE; + } + diff --git a/3rdparty/openpgm-svn-r1085/pgm/getnodeaddr_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/getnodeaddr_unittest.c index 6792d2a..a226931 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/getnodeaddr_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/getnodeaddr_unittest.c @@ -20,7 +20,7 @@ */ /* IFF_UP */ -#define _BSD_SOURCE +#define _BSD_SOURCE 1 #include <errno.h> #include <signal.h> diff --git a/3rdparty/openpgm-svn-r1085/pgm/gsi.c b/3rdparty/openpgm-svn-r1135/pgm/gsi.c index e7ebec4..c086cb9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/gsi.c +++ b/3rdparty/openpgm-svn-r1135/pgm/gsi.c @@ -181,8 +181,13 @@ pgm_gsi_print_r ( pgm_return_val_if_fail (NULL != buf, -1); pgm_return_val_if_fail (bufsize > 0, -1); +#ifdef _MSC_VER + return _snprintf_s (buf, bufsize, _TRUNCATE, "%i.%i.%i.%i.%i.%i", + src[0], src[1], src[2], src[3], src[4], src[5]); +#else return snprintf (buf, bufsize, "%i.%i.%i.%i.%i.%i", src[0], src[1], src[2], src[3], src[4], src[5]); +#endif } /* transform GSI to ASCII string form. diff --git a/3rdparty/openpgm-svn-r1135/pgm/gsi.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/gsi.c.c89.patch new file mode 100644 index 0000000..b7edc28 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/gsi.c.c89.patch @@ -0,0 +1,53 @@ +--- gsi.c 2010-08-04 11:14:59.000000000 +0800 ++++ gsi.c89 2010-08-04 11:16:29.000000000 +0800 +@@ -54,12 +54,14 @@ + memcpy (gsi, g_checksum_get_string (checksum) + 10, 6); + g_checksum_free (checksum); + #else ++ { + struct pgm_md5_t ctx; + char resblock[16]; + pgm_md5_init_ctx (&ctx); + pgm_md5_process_bytes (&ctx, data, length); + pgm_md5_finish_ctx (&ctx, resblock); + memcpy (gsi, resblock + 10, 6); ++ } + #endif + return TRUE; + } +@@ -94,6 +96,7 @@ + { + pgm_return_val_if_fail (NULL != gsi, FALSE); + ++ { + char hostname[NI_MAXHOST]; + int retval = gethostname (hostname, sizeof(hostname)); + if (0 != retval) { +@@ -111,6 +114,7 @@ + } + + return pgm_gsi_create_from_string (gsi, hostname, -1); ++ } + } + + /* create a global session ID based on the IP address. +@@ -129,6 +133,7 @@ + + pgm_return_val_if_fail (NULL != gsi, FALSE); + ++ { + int retval = gethostname (hostname, sizeof(hostname)); + if (0 != retval) { + pgm_set_error (error, +@@ -157,8 +162,11 @@ + } + memcpy (gsi, &((struct sockaddr_in*)(res->ai_addr))->sin_addr, sizeof(struct in_addr)); + freeaddrinfo (res); ++ { + const uint16_t random_val = pgm_random_int_range (0, UINT16_MAX); + memcpy ((uint8_t*)gsi + sizeof(struct in_addr), &random_val, sizeof(random_val)); ++ } ++ } + return TRUE; + } + diff --git a/3rdparty/openpgm-svn-r1085/pgm/gsi_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/gsi_unittest.c index dc4c244..dc4c244 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/gsi_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/gsi_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/hashtable.c b/3rdparty/openpgm-svn-r1135/pgm/hashtable.c index da842aa..7b99cda 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/hashtable.c +++ b/3rdparty/openpgm-svn-r1135/pgm/hashtable.c @@ -46,7 +46,7 @@ struct pgm_hashtable_t pgm_equalfunc_t key_equal_func; }; -#define PGM_HASHTABLE_RESIZE(hash_ttable) \ +#define PGM_HASHTABLE_RESIZE(hash_table) \ do { \ if ( (hash_table->size >= 3 * hash_table->nnodes && hash_table->size > HASHTABLE_MIN_SIZE) || \ (3 * hash_table->size <= hash_table->nnodes && hash_table->size < HASHTABLE_MAX_SIZE) ) \ diff --git a/3rdparty/openpgm-svn-r1135/pgm/hashtable.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/hashtable.c.c89.patch new file mode 100644 index 0000000..d4d7406 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/hashtable.c.c89.patch @@ -0,0 +1,47 @@ +73a74 +> { +83a85 +> } +93c95,97 +< for (unsigned i = 0; i < hash_table->size; i++) +--- +> { +> unsigned i; +> for (i = 0; i < hash_table->size; i++) +94a99 +> } +140a146 +> { +142a149 +> } +153a161 +> { +155a164 +> } +208c217,219 +< for (unsigned i = 0; i < hash_table->size; i++) +--- +> { +> unsigned i; +> for (i = 0; i < hash_table->size; i++) +212a224 +> } +226,228c238,244 +< +< for (unsigned i = 0; i < hash_table->size; i++) +< for (pgm_hashnode_t *node = hash_table->nodes[i], *next; node; node = next) +--- +> +> { +> unsigned i; +> for (i = 0; i < hash_table->size; i++) +> { +> pgm_hashnode_t *node, *next; +> for (node = hash_table->nodes[i]; node; node = next) +230a247 +> { +233a251,252 +> } +> } +234a254 +> } diff --git a/3rdparty/openpgm-svn-r1085/pgm/histogram.c b/3rdparty/openpgm-svn-r1135/pgm/histogram.c index 3e5ad66..3e5ad66 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/histogram.c +++ b/3rdparty/openpgm-svn-r1135/pgm/histogram.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/histogram.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/histogram.c.c89.patch new file mode 100644 index 0000000..a5826fd --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/histogram.c.c89.patch @@ -0,0 +1,212 @@ +--- histogram.c 2010-05-21 11:35:50.000000000 +0800 ++++ histogram.c89 2010-08-04 11:32:46.000000000 +0800 +@@ -61,10 +61,12 @@ + value = INT_MAX - 1; + if (value < 0) + value = 0; ++ { + const unsigned i = bucket_index (histogram, value); + pgm_assert (value >= histogram->ranges[ i ]); + pgm_assert (value < histogram->ranges[ i + 1 ]); + accumulate (histogram, value, 1, i); ++ } + } + + void +@@ -74,12 +76,14 @@ + { + if (!pgm_histograms) + return; ++ { + pgm_slist_t* snapshot = pgm_histograms; + while (snapshot) { + pgm_histogram_t* histogram = snapshot->data; + pgm_histogram_write_html_graph (histogram, string); + snapshot = snapshot->next; + } ++ } + } + + static +@@ -119,8 +123,11 @@ + ) + { + pgm_count_t total = 0; +- for (unsigned i = 0; i < sample_set->counts_len; i++) ++ { ++ unsigned i; ++ for (i = 0; i < sample_set->counts_len; i++) + total += sample_set->counts[ i ]; ++ } + return total; + } + +@@ -173,12 +180,15 @@ + double log_current = log(current); + log_ratio = (log_max - log_current) / (histogram->bucket_count - i); + log_next = log_current + log_ratio; +- int next = floor(exp(log_next) + 0.5); ++ { ++/* force cast to ignore float to int conversion warning */ ++ int next = (int)floor(exp(log_next) + 0.5); + if (next > current) + current = next; + else + current++; + set_bucket_range (histogram, i, current); ++ } + } + pgm_assert (histogram->bucket_count == i); + } +@@ -192,6 +202,7 @@ + { + pgm_assert (histogram->ranges[0] <= value); + pgm_assert (histogram->ranges[ histogram->bucket_count ] > value); ++ { + unsigned under = 0; + unsigned over = histogram->bucket_count; + unsigned mid; +@@ -209,6 +220,7 @@ + pgm_assert (histogram->ranges[ mid ] <= value && + histogram->ranges[ mid + 1] > value); + return mid; ++ } + } + + static +@@ -231,19 +243,21 @@ + pgm_string_t* restrict output + ) + { +- pgm_count_t snapshot_counts[ histogram->sample.counts_len ]; +- pgm_sample_set_t snapshot = { +- .counts = snapshot_counts, +- .counts_len = histogram->sample.counts_len, +- .sum = histogram->sample.sum, +- .square_sum = histogram->sample.square_sum +- }; ++ pgm_count_t* snapshot_counts = pgm_newa (pgm_count_t, histogram->sample.counts_len); ++ pgm_sample_set_t snapshot; ++ snapshot.counts = snapshot_counts; ++ snapshot.counts_len = histogram->sample.counts_len; ++ snapshot.sum = histogram->sample.sum; ++ snapshot.square_sum = histogram->sample.square_sum; ++ + memcpy (snapshot_counts, histogram->sample.counts, sizeof(pgm_count_t) * histogram->sample.counts_len); + ++ { + pgm_count_t sample_count = sample_set_total_count (&snapshot); + write_ascii_header (histogram, &snapshot, sample_count, output); + pgm_string_append (output, newline); + ++ { + double max_size = get_peak_bucket_size (histogram, &snapshot); + unsigned largest_non_empty_bucket = histogram->bucket_count - 1; + while (0 == snapshot.counts[ largest_non_empty_bucket ]) +@@ -253,8 +267,11 @@ + largest_non_empty_bucket--; + } + ++ { + int print_width = 1; +- for (unsigned i = 0; i < histogram->bucket_count; ++i) ++ { ++ unsigned i; ++ for (i = 0; i < histogram->bucket_count; ++i) + { + if (snapshot.counts[ i ]) { + pgm_string_t* bucket_range = get_ascii_bucket_range (histogram, i); +@@ -264,16 +281,22 @@ + print_width = width; + } + } ++ } + ++ { + int64_t remaining = sample_count; + int64_t past = 0; +- for (unsigned i = 0; i < histogram->bucket_count; ++i) ++ { ++ unsigned i; ++ for (i = 0; i < histogram->bucket_count; ++i) + { + pgm_count_t current = snapshot.counts[ i ]; + remaining -= current; ++ { + pgm_string_t* bucket_range = get_ascii_bucket_range (histogram, i); + pgm_string_append_printf (output, "%*s ", print_width, bucket_range->str); + pgm_string_free (bucket_range, TRUE); ++ } + if (0 == current && + i < histogram->bucket_count - 1 && + 0 == snapshot.counts[ i + 1 ]) +@@ -288,12 +311,19 @@ + continue; + } + ++ { + const double current_size = get_bucket_size (histogram, current, i); + write_ascii_bucket_graph (current_size, max_size, output); ++ } + write_ascii_bucket_context (past, current, remaining, i, output); + pgm_string_append (output, newline); + past += current; + } ++ } ++ } ++ } ++ } ++ } + } + + static +@@ -310,8 +340,8 @@ + histogram->histogram_name ? histogram->histogram_name : "(null)", + sample_count); + if (sample_count > 0) { +- const double average = sample_set->sum / sample_count; +- const double variance = sample_set->square_sum / sample_count ++ const double average = (double)sample_set->sum / sample_count; ++ const double variance = (double)sample_set->square_sum / sample_count + - average * average; + const double standard_deviation = sqrt (variance); + pgm_string_append_printf (output, +@@ -329,7 +359,7 @@ + ) + { + static const int k_line_length = 72; +- int x_count = (k_line_length * (current_size / max_size) + 0.5); ++ int x_count = (int)(k_line_length * (current_size / max_size) + 0.5); + int x_remainder = k_line_length - x_count; + while (0 < x_count--) + pgm_string_append_c (output, '-'); +@@ -375,11 +405,14 @@ + ) + { + double max_size = 0; +- for (unsigned i = 0; i < histogram->bucket_count; i++) { ++ { ++ unsigned i; ++ for (i = 0; i < histogram->bucket_count; i++) { + const double current_size = get_bucket_size (histogram, sample_set->counts[ i ], i); + if (current_size > max_size) + max_size = current_size; + } ++ } + return max_size; + } + +@@ -392,11 +425,13 @@ + ) + { + pgm_assert (histogram->ranges[ i + 1 ] > histogram->ranges[ i ]); ++ { + static const double kTransitionWidth = 5; + double denominator = histogram->ranges[ i + 1 ] - histogram->ranges[ i ]; + if (denominator > kTransitionWidth) + denominator = kTransitionWidth; + return current / denominator; ++ } + } + + static diff --git a/3rdparty/openpgm-svn-r1085/pgm/htdocs/404.html b/3rdparty/openpgm-svn-r1135/pgm/htdocs/404.html index 538c90a..538c90a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/htdocs/404.html +++ b/3rdparty/openpgm-svn-r1135/pgm/htdocs/404.html diff --git a/3rdparty/openpgm-svn-r1085/pgm/htdocs/base.css b/3rdparty/openpgm-svn-r1135/pgm/htdocs/base.css index 5aba236..5aba236 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/htdocs/base.css +++ b/3rdparty/openpgm-svn-r1135/pgm/htdocs/base.css diff --git a/3rdparty/openpgm-svn-r1085/pgm/htdocs/convert_to_macro.pl b/3rdparty/openpgm-svn-r1135/pgm/htdocs/convert_to_macro.pl index bea44af..bea44af 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/htdocs/convert_to_macro.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/htdocs/convert_to_macro.pl diff --git a/3rdparty/openpgm-svn-r1085/pgm/htdocs/robots.txt b/3rdparty/openpgm-svn-r1135/pgm/htdocs/robots.txt index 1f53798..1f53798 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/htdocs/robots.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/htdocs/robots.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/htdocs/xhtml10_strict.doctype b/3rdparty/openpgm-svn-r1135/pgm/htdocs/xhtml10_strict.doctype index 6a3e4f9..6a3e4f9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/htdocs/xhtml10_strict.doctype +++ b/3rdparty/openpgm-svn-r1135/pgm/htdocs/xhtml10_strict.doctype diff --git a/3rdparty/openpgm-svn-r1085/pgm/http.c b/3rdparty/openpgm-svn-r1135/pgm/http.c index 82e934c..442f6f3 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/http.c +++ b/3rdparty/openpgm-svn-r1135/pgm/http.c @@ -34,6 +34,7 @@ #include <impl/framework.h> #include <impl/receiver.h> #include <impl/socket.h> +#include <pgm/if.h> #include <pgm/version.h> #include "pgm/http.h" @@ -709,14 +710,22 @@ http_set_static_response ( pgm_string_printf (response, "HTTP/1.0 %d %s\r\n" "Server: OpenPGM HTTP Server %u.%u.%u\r\n" "Last-Modified: Fri, 1 Jan 2010, 00:00:01 GMT\r\n" +#ifndef _MSC_VER + "Content-Length: %zd\r\n" +#else "Content-Length: %d\r\n" +#endif "Content-Type: %s\r\n" "Connection: close\r\n" "\r\n", connection->status_code, connection->status_text, pgm_major_version, pgm_minor_version, pgm_micro_version, +#ifndef _MSC_VER content_length, +#else + (int)content_length, +#endif connection->content_type ); pgm_string_append (response, content); @@ -737,14 +746,22 @@ http_set_response ( pgm_string_t* response = pgm_string_new (NULL); pgm_string_printf (response, "HTTP/1.0 %d %s\r\n" "Server: OpenPGM HTTP Server %u.%u.%u\r\n" +#ifndef _MSC_VER + "Content-Length: %zd\r\n" +#else "Content-Length: %d\r\n" +#endif "Content-Type: %s\r\n" "Connection: close\r\n" "\r\n", connection->status_code, connection->status_text, pgm_major_version, pgm_minor_version, pgm_micro_version, +#ifndef _MSC_VER content_length, +#else + (int)content_length, +#endif connection->content_type ); pgm_string_append (response, content); diff --git a/3rdparty/openpgm-svn-r1085/pgm/http_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/http_unittest.c index 32ba11b..32ba11b 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/http_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/http_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/if.c b/3rdparty/openpgm-svn-r1135/pgm/if.c index f034758..d149608 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/if.c +++ b/3rdparty/openpgm-svn-r1135/pgm/if.c @@ -19,7 +19,10 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + #include <errno.h> #include <ctype.h> #include <stdio.h> diff --git a/3rdparty/openpgm-svn-r1135/pgm/if.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/if.c.c89.patch new file mode 100644 index 0000000..245479a --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/if.c.c89.patch @@ -0,0 +1,376 @@ +--- if.c 2010-05-29 17:36:46.000000000 +0800 ++++ if.c89 2010-08-05 13:19:04.000000000 +0800 +@@ -102,8 +102,13 @@ + char b[IF_NAMESIZE * 2 + 3]; + + pgm_if_indextoname (i, rname); ++#ifdef _MSC_VER ++ _snprintf_s (b, sizeof(b), _TRUNCATE, "%s (%s)", ++ ifa->ifa_name ? ifa->ifa_name : "(null)", rname); ++#else + sprintf (b, "%s (%s)", + ifa->ifa_name ? ifa->ifa_name : "(null)", rname); ++#endif + + if (NULL == ifa->ifa_addr || + (ifa->ifa_addr->sa_family != AF_INET && +@@ -121,6 +126,7 @@ + continue; + } + ++ { + char s[INET6_ADDRSTRLEN]; + getnameinfo (ifa->ifa_addr, pgm_sockaddr_len(ifa->ifa_addr), + s, sizeof(s), +@@ -137,6 +143,7 @@ + ifa->ifa_flags & IFF_BROADCAST ? "YES" : "NO ", + ifa->ifa_flags & IFF_MULTICAST ? "YES" : "NO " + ); ++ } + } + + pgm_freeifaddrs (ifap); +@@ -190,9 +197,12 @@ + pgm_inet_ntop (AF_INET6, netmask, snetmask, sizeof(snetmask))); + #endif + +- for (unsigned i = 0; i < 16; i++) ++ { ++ unsigned i; ++ for (i = 0; i < 16; i++) + if ((addr->s6_addr[i] & netmask->s6_addr[i]) != (netaddr->s6_addr[i] & netmask->s6_addr[i])) + return FALSE; ++ } + return TRUE; + } + +@@ -254,8 +264,12 @@ + { + const size_t ifnamelen = strlen(ifname); + if (']' == ifname[ ifnamelen - 1 ]) { ++#ifdef _MSC_VER ++ strncpy_s (literal, sizeof(literal), ifname + 1, ifnamelen - 2); ++#else + strncpy (literal, ifname + 1, ifnamelen - 2); + literal[ ifnamelen - 2 ] = 0; ++#endif + family = AF_INET6; /* force IPv6 evaluation */ + check_inet6_network = TRUE; /* may be a network IP or CIDR block */ + check_addr = TRUE; /* cannot be not a name */ +@@ -278,11 +292,13 @@ + ifname ? "\"" : "", ifname ? ifname : "(null)", ifname ? "\"" : ""); + return FALSE; + } ++ { + struct sockaddr_in s4; + memset (&s4, 0, sizeof(s4)); + s4.sin_family = AF_INET; + s4.sin_addr.s_addr = htonl (in_addr.s_addr); + memcpy (&addr, &s4, sizeof(s4)); ++ } + + check_inet_network = TRUE; + check_addr = TRUE; +@@ -297,11 +313,13 @@ + ifname ? "\"" : "", ifname ? ifname : "(null)", ifname ? "\"" : ""); + return FALSE; + } ++ { + struct sockaddr_in6 s6; + memset (&s6, 0, sizeof(s6)); + s6.sin6_family = AF_INET6; + s6.sin6_addr = in6_addr; + memcpy (&addr, &s6, sizeof(s6)); ++ } + + check_inet6_network = TRUE; + check_addr = TRUE; +@@ -310,12 +328,13 @@ + /* numeric host with scope id */ + if (!check_addr) + { +- struct addrinfo hints = { +- .ai_family = family, +- .ai_socktype = SOCK_STREAM, /* not really, SOCK_RAW */ +- .ai_protocol = IPPROTO_TCP, /* not really, IPPROTO_PGM */ +- .ai_flags = AI_ADDRCONFIG | AI_NUMERICHOST /* AI_V4MAPPED is unhelpful */ +- }, *res; ++ struct addrinfo hints, *res; ++ memset (&hints, 0, sizeof(hints)); ++ hints.ai_family = family; ++ hints.ai_socktype = SOCK_STREAM; /* not really, SOCK_RAW */ ++ hints.ai_protocol = IPPROTO_TCP; /* not really, IPPROTO_PGM */ ++ hints.ai_flags = AI_ADDRCONFIG | AI_NUMERICHOST; /* AI_V4MAPPED is unhelpful */ ++ { + const int eai = getaddrinfo (ifname, NULL, &hints, &res); + switch (eai) { + case 0: +@@ -361,6 +380,7 @@ + gai_strerror (eai)); + return FALSE; + } ++ } + } + + #ifndef _WIN32 +@@ -441,13 +461,13 @@ + /* hostname lookup with potential DNS delay or error */ + if (!check_addr) + { +- struct addrinfo hints = { +- .ai_family = family, +- .ai_socktype = SOCK_STREAM, /* not really, SOCK_RAW */ +- .ai_protocol = IPPROTO_TCP, /* not really, IPPROTO_PGM */ +- .ai_flags = AI_ADDRCONFIG, /* AI_V4MAPPED is unhelpful */ +- }, *res; +- ++ struct addrinfo hints, *res; ++ memset (&hints, 0, sizeof(hints)); ++ hints.ai_family = family; ++ hints.ai_socktype = SOCK_STREAM; /* not really, SOCK_RAW */ ++ hints.ai_protocol = IPPROTO_TCP; /* not really, IPPROTO_PGM */ ++ hints.ai_flags = AI_ADDRCONFIG; /* AI_V4MAPPED is unhelpful */ ++ { + const int eai = getaddrinfo (ifname, NULL, &hints, &res); + switch (eai) { + case 0: +@@ -493,6 +513,7 @@ + gai_strerror (eai), eai); + return FALSE; + } ++ } + } + + /* iterate through interface list and match device name, ip or net address */ +@@ -525,6 +546,7 @@ + continue; + } + ++ { + const unsigned ifindex = pgm_if_nametoindex (ifa->ifa_addr->sa_family, ifa->ifa_name); + pgm_assert (0 != ifindex); + +@@ -532,7 +554,11 @@ + if (check_addr && + (0 == pgm_sockaddr_cmp (ifa->ifa_addr, (const struct sockaddr*)&addr))) + { ++#ifdef _MSC_VER ++ strcpy_s (ir->ir_name, IF_NAMESIZE, ifa->ifa_name); ++#else + strcpy (ir->ir_name, ifa->ifa_name); ++#endif + ir->ir_flags = ifa->ifa_flags; + if (ir->ir_flags & IFF_LOOPBACK) + pgm_warn (_("Interface %s reports as a loopback device."), ir->ir_name); +@@ -548,10 +574,15 @@ + if (check_inet_network && + AF_INET == ifa->ifa_addr->sa_family) + { +- const struct in_addr ifaddr = { .s_addr = ntohl (((struct sockaddr_in*)ifa->ifa_addr)->sin_addr.s_addr) }; +- const struct in_addr netmask = { .s_addr = ntohl (((struct sockaddr_in*)ifa->ifa_netmask)->sin_addr.s_addr) }; ++ struct in_addr ifaddr, netmask; ++ ifaddr.s_addr = ntohl (((struct sockaddr_in*)ifa->ifa_addr)->sin_addr.s_addr); ++ netmask.s_addr = ntohl (((struct sockaddr_in*)ifa->ifa_netmask)->sin_addr.s_addr); + if (is_in_net (&ifaddr, &in_addr, &netmask)) { ++#ifdef _MSC_VER ++ strcpy_s (ir->ir_name, IF_NAMESIZE, ifa->ifa_name); ++#else + strcpy (ir->ir_name, ifa->ifa_name); ++#endif + ir->ir_flags = ifa->ifa_flags; + if (ir->ir_flags & IFF_LOOPBACK) { + pgm_warn (_("Skipping matching loopback network device %s."), ir->ir_name); +@@ -573,7 +604,11 @@ + const struct in6_addr ifaddr = ((struct sockaddr_in6*)ifa->ifa_addr)->sin6_addr; + const struct in6_addr netmask = ((struct sockaddr_in6*)ifa->ifa_netmask)->sin6_addr; + if (is_in_net6 (&ifaddr, &in6_addr, &netmask)) { ++#ifdef _MSC_VER ++ strcpy_s (ir->ir_name, IF_NAMESIZE, ifa->ifa_name); ++#else + strcpy (ir->ir_name, ifa->ifa_name); ++#endif + ir->ir_flags = ifa->ifa_flags; + if (ir->ir_flags & IFF_LOOPBACK) { + pgm_warn (_("Skipping matching loopback network device %s."), ir->ir_name); +@@ -614,11 +649,15 @@ + } + + ir->ir_interface = ifindex; ++#ifdef _MSC_VER ++ strcpy_s (ir->ir_name, IF_NAMESIZE, ifa->ifa_name); ++#else + strcpy (ir->ir_name, ifa->ifa_name); ++#endif + memcpy (&ir->ir_addr, ifa->ifa_addr, pgm_sockaddr_len (ifa->ifa_addr)); + continue; + } +- ++ } + } + + if (0 == interface_matches) { +@@ -681,8 +720,12 @@ + const size_t grouplen = strlen(group); + if (']' == group[ grouplen - 1 ]) { + char literal[1024]; ++#ifdef _MSC_VER ++ strncpy_s (literal, sizeof(literal), group + 1, grouplen - 2); ++#else + strncpy (literal, group + 1, grouplen - 2); + literal[ grouplen - 2 ] = 0; ++#endif + if (pgm_inet_pton (AF_INET6, literal, &((struct sockaddr_in6*)addr)->sin6_addr) && + IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)addr)->sin6_addr)) + { +@@ -784,13 +827,14 @@ + #endif /* _WIN32 */ + + /* lookup group through name service */ +- struct addrinfo hints = { +- .ai_family = family, +- .ai_socktype = SOCK_STREAM, /* not really, SOCK_RAW */ +- .ai_protocol = IPPROTO_TCP, /* not really, IPPROTO_PGM */ +- .ai_flags = AI_ADDRCONFIG, /* AI_V4MAPPED is unhelpful */ +- }, *res; +- ++ { ++ struct addrinfo hints, *res; ++ memset (&hints, 0, sizeof(hints)); ++ hints.ai_family = family; ++ hints.ai_socktype = SOCK_STREAM; /* not really, SOCK_RAW */ ++ hints.ai_protocol = IPPROTO_TCP; /* not really, IPPROTO_PGM */ ++ hints.ai_flags = AI_ADDRCONFIG; /* AI_V4MAPPED is unhelpful */ ++ { + const int eai = getaddrinfo (group, NULL, &hints, &res); + if (0 != eai) { + pgm_set_error (error, +@@ -816,6 +860,8 @@ + group ? "\"" : "", group ? group : "(null)", group ? "\"" : ""); + freeaddrinfo (res); + return FALSE; ++ } ++ } + } + + /* parse an interface entity from a network parameter. +@@ -869,6 +915,7 @@ + } + + /* check interface name length limit */ ++ { + char** tokens = pgm_strsplit (entity, ",", 10); + int j = 0; + while (tokens && tokens[j]) +@@ -903,6 +950,7 @@ + + pgm_strfreev (tokens); + *interface_list = source_list; ++ } + return TRUE; + } + +@@ -945,6 +993,7 @@ + (const void*)recv_list, + (const void*)error); + ++ { + struct group_source_req* recv_gsr; + struct interface_req* primary_interface = (struct interface_req*)pgm_memdup ((*interface_list)->data, sizeof(struct interface_req)); + +@@ -957,6 +1006,7 @@ + recv_gsr->gsr_group.ss_family = family; + + /* track IPv6 scope from any resolved interface */ ++ { + unsigned scope_id = 0; + + /* if using unspec default group check the interface for address family +@@ -1053,11 +1103,13 @@ + *recv_list = pgm_list_append (*recv_list, recv_gsr); + pgm_free (primary_interface); + return TRUE; ++ } + } + + /* parse one or more multicast receive groups. + */ + ++ { + int j = 0; + char** tokens = pgm_strsplit (entity, ",", 10); + while (tokens && tokens[j]) +@@ -1126,6 +1178,8 @@ + pgm_strfreev (tokens); + pgm_free (primary_interface); + return TRUE; ++ } ++ } + } + + static +@@ -1155,6 +1209,7 @@ + (const void*)send_list, + (const void*)error); + ++ { + struct group_source_req* send_gsr; + const struct interface_req* primary_interface = (struct interface_req*)(*interface_list)->data; + +@@ -1201,6 +1256,7 @@ + memcpy (&send_gsr->gsr_source, &send_gsr->gsr_group, pgm_sockaddr_len ((struct sockaddr*)&send_gsr->gsr_group)); + *send_list = pgm_list_append (*send_list, send_gsr); + return TRUE; ++ } + } + + /* parse network parameter +@@ -1333,9 +1389,14 @@ + } + + /* entity from b to p-1 */ ++ { + char entity[1024]; ++#ifdef _MSC_VER ++ strncpy_s (entity, sizeof(entity), b, p - b); ++#else + strncpy (entity, b, sizeof(entity)); + entity[p - b] = 0; ++#endif + + switch (ec++) { + case ENTITY_INTERFACE: +@@ -1391,6 +1452,7 @@ + + b = ++p; + continue; ++ } + } + + p++; +@@ -1540,6 +1602,7 @@ + + if (!network_parse (network, family, &recv_list, &send_list, error)) + return FALSE; ++ { + const size_t recv_list_len = pgm_list_length (recv_list); + const size_t send_list_len = pgm_list_length (send_list); + ai = pgm_malloc0 (sizeof(struct pgm_addrinfo_t) + +@@ -1548,7 +1611,8 @@ + ai->ai_recv_addrs = (void*)((char*)ai + sizeof(struct pgm_addrinfo_t)); + ai->ai_send_addrs_len = send_list_len; + ai->ai_send_addrs = (void*)((char*)ai->ai_recv_addrs + recv_list_len * sizeof(struct group_source_req)); +- ++ ++ { + size_t i = 0; + while (recv_list) { + memcpy (&ai->ai_recv_addrs[i++], recv_list->data, sizeof(struct group_source_req)); +@@ -1563,6 +1627,8 @@ + } + *res = ai; + return TRUE; ++ } ++ } + } + + void diff --git a/3rdparty/openpgm-svn-r1085/pgm/if_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/if_unittest.c index dbaa684..ada444a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/if_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/if_unittest.c @@ -22,7 +22,9 @@ */ /* IFF_UP */ -#define _BSD_SOURCE +#ifndef _BSD_SOURCE +# define _BSD_SOURCE 1 +#endif #include <errno.h> #include <netdb.h> diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/checksum.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/checksum.h index 67f71a6..67f71a6 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/checksum.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/checksum.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/engine.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/engine.h index eeacbe7..eeacbe7 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/engine.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/engine.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/features.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/features.h index a8dadf7..a8dadf7 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/features.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/features.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/fixed.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/fixed.h index f84ef33..f864989 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/fixed.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/fixed.h @@ -124,6 +124,8 @@ pgm_fp16pow ( ) { uint_fast32_t result = pgm_fp16 (1); +#if defined(__STDC_VERSION__) && (__STDC_VERSION >= 199901L) +/* C99 version */ for (uint_fast32_t i = x; y; y >>= 1) @@ -132,6 +134,20 @@ pgm_fp16pow ( result = (result * i + 32768) >> 16; i = (i * i + 32768) >> 16; } +#else +/* C89 version */ + { + uint_fast32_t i; + for (i = x; + y; + y >>= 1) + { + if (y & 1) + result = (result * i + 32768) >> 16; + i = (i * i + 32768) >> 16; + } + } +#endif return result; } diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/framework.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/framework.h index 951ad26..951ad26 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/framework.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/framework.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/galois.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/galois.h index 2f008ed..e90e66b 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/galois.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/galois.h @@ -30,7 +30,11 @@ PGM_BEGIN_DECLS /* 8 bit wide galois field integer: GF(2⁸) */ +#ifdef _MSC_VER +typedef uint8_t pgm_gf8_t; +#else typedef uint8_t __attribute__((__may_alias__)) pgm_gf8_t; +#endif /* E denotes the encoding symbol length in bytes. * S denotes the symbol size in units of m-bit elements. When m = 8, @@ -125,12 +129,23 @@ pgm_gfdiv ( pgm_gf8_t b ) { +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +/* C99 version */ if (PGM_UNLIKELY( !a )) { return 0; } - int sum = pgm_gflog[ a ] - pgm_gflog[ b ]; + const int sum = pgm_gflog[ a ] - pgm_gflog[ b ]; return sum < 0 ? pgm_gfantilog[ sum + PGM_GF_MAX ] : pgm_gfantilog[ sum ]; +#else +/* C89 version */ + const int sum = pgm_gflog[ a ] - pgm_gflog[ b ]; + if (PGM_UNLIKELY( !a )) { + return 0; + } + + return sum < 0 ? pgm_gfantilog[ sum + PGM_GF_MAX ] : pgm_gfantilog[ sum ]; +#endif } PGM_END_DECLS diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/getifaddrs.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/getifaddrs.h index 4732a21..eddb37a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/getifaddrs.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/getifaddrs.h @@ -44,8 +44,11 @@ PGM_BEGIN_DECLS #ifndef IF_NAMESIZE # ifdef IFNAMSIZ # define IF_NAMESIZE IFNAMSIZ +# elif defined(MAX_INTERFACE_NAME_LEN) +# define IF_NAMESIZE MAX_INTERFACE_NAME_LEN # elif defined(_WIN32) -# define IF_NAMESIZE 40 +/* 40 for UUID, 256 for device path */ +# define IF_NAMESIZE 256 # else # define IF_NAMESIZE 16 # endif diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/getnodeaddr.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/getnodeaddr.h index befcf35..befcf35 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/getnodeaddr.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/getnodeaddr.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/hashtable.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/hashtable.h index 4271cb6..4271cb6 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/hashtable.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/hashtable.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/histogram.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/histogram.h index 92ddeb9..92ddeb9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/histogram.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/histogram.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/i18n.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/i18n.h index c97f3de..c97f3de 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/i18n.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/i18n.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/indextoaddr.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/indextoaddr.h index 6c6599e..df2b2ef 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/indextoaddr.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/indextoaddr.h @@ -34,7 +34,7 @@ PGM_BEGIN_DECLS -PGM_GNUC_INTERNAL bool pgm_if_indextoaddr (unsigned, sa_family_t, uint32_t, struct sockaddr*restrict, pgm_error_t**restrict); +PGM_GNUC_INTERNAL bool pgm_if_indextoaddr (const unsigned, const sa_family_t, const uint32_t, struct sockaddr*restrict, pgm_error_t**restrict); PGM_END_DECLS diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/indextoname.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/indextoname.h index d5d7964..d5d7964 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/indextoname.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/indextoname.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/inet_network.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/inet_network.h index 64c43fb..64c43fb 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/inet_network.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/inet_network.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/ip.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/ip.h index 8f18775..2db402e 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/ip.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/ip.h @@ -54,8 +54,8 @@ #ifndef _WIN32 # include <netinet/in.h> +# include <sys/param.h> #endif -#include <sys/param.h> #include <pgm/types.h> PGM_BEGIN_DECLS diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/list.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/list.h index 91a3ed3..91a3ed3 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/list.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/list.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/math.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/math.h index 8c7c2ba..00eb808 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/math.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/math.h @@ -43,9 +43,20 @@ pgm_power2_log2 ( { static const unsigned int b[] = { 0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0, 0xFF00FF00, 0xFFFF0000 }; unsigned int r = (v & b[0]) != 0; +#if defined(__STDC_VERSION__) && (__STDC_VERSION >= 199901L) +/* C99 version */ for (unsigned i = 4; i > 0; i--) { r |= ((v & b[i]) != 0) << i; } +#else +/* C89 version */ + { + unsigned i; + for (i = 4; i > 0; i--) { + r |= ((v & b[i]) != 0) << i; + } + } +#endif return r; } diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/md5.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/md5.h index b28ab7d..b28ab7d 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/md5.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/md5.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/mem.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/mem.h index 9377ced..9377ced 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/mem.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/mem.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/messages.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/messages.h index e7065b0..e7065b0 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/messages.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/messages.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/nametoindex.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/nametoindex.h index a25bd89..a25bd89 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/nametoindex.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/nametoindex.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/net.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/net.h index aa9beaf..fd30c1c 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/net.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/net.h @@ -29,9 +29,24 @@ PGM_BEGIN_DECLS -PGM_GNUC_INTERNAL ssize_t pgm_sendto (pgm_sock_t*restrict, bool, bool, const void*restrict, size_t, const struct sockaddr*restrict, socklen_t); +PGM_GNUC_INTERNAL ssize_t pgm_sendto_hops (pgm_sock_t*restrict, bool, bool, int, const void*restrict, size_t, const struct sockaddr*restrict, socklen_t); PGM_GNUC_INTERNAL int pgm_set_nonblocking (int fd[2]); +static inline +ssize_t +pgm_sendto ( + pgm_sock_t*restrict sock, + bool use_rate_limit, + bool use_router_alert, + const void*restrict buf, + size_t len, + const struct sockaddr*restrict to, + socklen_t tolen + ) +{ + return pgm_sendto_hops (sock, use_rate_limit, use_router_alert, -1, buf, len, to, tolen); +} + PGM_END_DECLS #endif /* __PGM_IMPL_NET_H__ */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/notify.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/notify.h index 1db4475..47f9e1c 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/notify.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/notify.h @@ -89,9 +89,8 @@ pgm_notify_init ( pgm_notify_t* notify ) { - pgm_assert (NULL != notify); - #if defined(CONFIG_HAVE_EVENTFD) + pgm_assert (NULL != notify); notify->eventfd = -1; int retval = eventfd (0, 0); if (-1 == retval) @@ -102,6 +101,7 @@ pgm_notify_init ( retval = fcntl (notify->eventfd, F_SETFL, fd_flags | O_NONBLOCK); return 0; #elif !defined(_WIN32) + pgm_assert (NULL != notify); notify->pipefd[0] = notify->pipefd[1] = -1; int retval = pipe (notify->pipefd); pgm_assert (0 == retval); @@ -121,8 +121,11 @@ pgm_notify_init ( /* use loopback sockets to simulate a pipe suitable for win32/select() */ struct sockaddr_in addr; SOCKET listener; + int sockerr; int addrlen = sizeof (addr); + const unsigned long one = 1; + pgm_assert (NULL != notify); notify->s[0] = notify->s[1] = INVALID_SOCKET; listener = socket (AF_INET, SOCK_STREAM, 0); @@ -133,36 +136,37 @@ pgm_notify_init ( addr.sin_addr.s_addr = inet_addr ("127.0.0.1"); pgm_assert (addr.sin_addr.s_addr != INADDR_NONE); - int rc = bind (listener, (const struct sockaddr*)&addr, sizeof (addr)); - pgm_assert (rc != SOCKET_ERROR); + sockerr = bind (listener, (const struct sockaddr*)&addr, sizeof (addr)); + pgm_assert (sockerr != SOCKET_ERROR); - rc = getsockname (listener, (struct sockaddr*)&addr, &addrlen); - pgm_assert (rc != SOCKET_ERROR); + sockerr = getsockname (listener, (struct sockaddr*)&addr, &addrlen); + pgm_assert (sockerr != SOCKET_ERROR); // Listen for incoming connections. - rc = listen (listener, 1); - pgm_assert (rc != SOCKET_ERROR); + sockerr = listen (listener, 1); + pgm_assert (sockerr != SOCKET_ERROR); // Create the socket. notify->s[1] = WSASocket (AF_INET, SOCK_STREAM, 0, NULL, 0, 0); pgm_assert (notify->s[1] != INVALID_SOCKET); // Connect to the remote peer. - rc = connect (notify->s[1], (struct sockaddr*)&addr, addrlen); - pgm_assert (rc != SOCKET_ERROR); + sockerr = connect (notify->s[1], (struct sockaddr*)&addr, addrlen); + pgm_assert (sockerr != SOCKET_ERROR); // Accept connection. notify->s[0] = accept (listener, NULL, NULL); pgm_assert (notify->s[0] != INVALID_SOCKET); // Set read-end to non-blocking mode - const unsigned long one = 1; - rc = ioctlsocket (notify->s[0], FIONBIO, &one); - pgm_assert (rc != SOCKET_ERROR); +#pragma warning( disable : 4090 ) + sockerr = ioctlsocket (notify->s[0], FIONBIO, &one); +#pragma warning( default : 4090 ) + pgm_assert (sockerr != SOCKET_ERROR); // We don't need the listening socket anymore. Close it. - rc = closesocket (listener); - pgm_assert (rc != SOCKET_ERROR); + sockerr = closesocket (listener); + pgm_assert (sockerr != SOCKET_ERROR); return 0; #endif @@ -209,20 +213,21 @@ pgm_notify_send ( pgm_notify_t* notify ) { - pgm_assert (NULL != notify); - #if defined(CONFIG_HAVE_EVENTFD) - pgm_assert (-1 != notify->eventfd); uint64_t u = 1; + pgm_assert (NULL != notify); + pgm_assert (-1 != notify->eventfd); ssize_t s = write (notify->eventfd, &u, sizeof(u)); return (s == sizeof(u)); #elif !defined(_WIN32) - pgm_assert (-1 != notify->pipefd[1]); const char one = '1'; + pgm_assert (NULL != notify); + pgm_assert (-1 != notify->pipefd[1]); return (1 == write (notify->pipefd[1], &one, sizeof(one))); #else - pgm_assert (INVALID_SOCKET != notify->s[1]); const char one = '1'; + pgm_assert (NULL != notify); + pgm_assert (INVALID_SOCKET != notify->s[1]); return (1 == send (notify->s[1], &one, sizeof(one), 0)); #endif } @@ -233,19 +238,20 @@ pgm_notify_read ( pgm_notify_t* notify ) { - pgm_assert (NULL != notify); - #if defined(CONFIG_HAVE_EVENTFD) - pgm_assert (-1 != notify->eventfd); uint64_t u; + pgm_assert (NULL != notify); + pgm_assert (-1 != notify->eventfd); return (sizeof(u) == read (notify->eventfd, &u, sizeof(u))); #elif !defined(_WIN32) - pgm_assert (-1 != notify->pipefd[0]); char buf; + pgm_assert (NULL != notify); + pgm_assert (-1 != notify->pipefd[0]); return (sizeof(buf) == read (notify->pipefd[0], &buf, sizeof(buf))); #else - pgm_assert (INVALID_SOCKET != notify->s[0]); char buf; + pgm_assert (NULL != notify); + pgm_assert (INVALID_SOCKET != notify->s[0]); return (sizeof(buf) == recv (notify->s[0], &buf, sizeof(buf), 0)); #endif } @@ -256,19 +262,20 @@ pgm_notify_clear ( pgm_notify_t* notify ) { - pgm_assert (NULL != notify); - #if defined(CONFIG_HAVE_EVENTFD) - pgm_assert (-1 != notify->eventfd); uint64_t u; + pgm_assert (NULL != notify); + pgm_assert (-1 != notify->eventfd); while (sizeof(u) == read (notify->eventfd, &u, sizeof(u))); #elif !defined(_WIN32) - pgm_assert (-1 != notify->pipefd[0]); char buf; + pgm_assert (NULL != notify); + pgm_assert (-1 != notify->pipefd[0]); while (sizeof(buf) == read (notify->pipefd[0], &buf, sizeof(buf))); #else - pgm_assert (INVALID_SOCKET != notify->s[0]); char buf; + pgm_assert (NULL != notify); + pgm_assert (INVALID_SOCKET != notify->s[0]); while (sizeof(buf) == recv (notify->s[0], &buf, sizeof(buf), 0)); #endif } diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/packet_parse.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/packet_parse.h index 4416e21..4416e21 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/packet_parse.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/packet_parse.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/packet_test.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/packet_test.h index 1b39006..1b39006 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/packet_test.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/packet_test.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/pgmMIB.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/pgmMIB.h index 6f80271..6f80271 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/pgmMIB.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/pgmMIB.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/pgmMIB_columns.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/pgmMIB_columns.h index 545e519..545e519 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/pgmMIB_columns.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/pgmMIB_columns.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/pgmMIB_enums.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/pgmMIB_enums.h index 9ae5760..9ae5760 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/pgmMIB_enums.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/pgmMIB_enums.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/processor.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/processor.h index f7ee31a..f7ee31a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/processor.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/processor.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/queue.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/queue.h index c640e52..c640e52 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/queue.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/queue.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/rand.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/rand.h index 0adfd78..0adfd78 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/rand.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/rand.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/rate_control.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/rate_control.h index b27b266..b27b266 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/rate_control.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/rate_control.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/receiver.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/receiver.h index e9c3a75..e9c3a75 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/receiver.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/receiver.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/reed_solomon.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/reed_solomon.h index 98f6734..98f6734 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/reed_solomon.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/reed_solomon.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/rxw.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/rxw.h index 89a8921..6eaa9f0 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/rxw.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/rxw.h @@ -109,10 +109,13 @@ struct pgm_rxw_t { size_t size; /* in bytes */ unsigned alloc; /* in pkts */ #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +/* C99 flexible array, sizeof() invalid */ struct pgm_sk_buff_t* pdata[]; -#elif defined(__cplusplus) +#elif !defined(__STDC_VERSION__) || defined(__cplusplus) +/* C90 and older */ struct pgm_sk_buff_t* pdata[1]; #else +/* GNU C variable-length object */ struct pgm_sk_buff_t* pdata[0]; #endif }; @@ -128,9 +131,9 @@ PGM_GNUC_INTERNAL ssize_t pgm_rxw_readv (pgm_rxw_t*const restrict, struct pgm_ms PGM_GNUC_INTERNAL unsigned pgm_rxw_remove_trail (pgm_rxw_t*const) PGM_GNUC_WARN_UNUSED_RESULT; PGM_GNUC_INTERNAL unsigned pgm_rxw_update (pgm_rxw_t*const, const uint32_t, const uint32_t, const pgm_time_t, const pgm_time_t) PGM_GNUC_WARN_UNUSED_RESULT; PGM_GNUC_INTERNAL void pgm_rxw_update_fec (pgm_rxw_t*const, const uint8_t); -PGM_GNUC_INTERNAL int pgm_rxw_confirm (pgm_rxw_t*const, uint32_t, pgm_time_t, pgm_time_t, pgm_time_t) PGM_GNUC_WARN_UNUSED_RESULT; +PGM_GNUC_INTERNAL int pgm_rxw_confirm (pgm_rxw_t*const, const uint32_t, const pgm_time_t, const pgm_time_t, const pgm_time_t) PGM_GNUC_WARN_UNUSED_RESULT; PGM_GNUC_INTERNAL void pgm_rxw_lost (pgm_rxw_t*const, const uint32_t); -PGM_GNUC_INTERNAL void pgm_rxw_state (pgm_rxw_t* restrict, struct pgm_sk_buff_t*restrict, const int); +PGM_GNUC_INTERNAL void pgm_rxw_state (pgm_rxw_t*const restrict, struct pgm_sk_buff_t*const restrict, const int); PGM_GNUC_INTERNAL struct pgm_sk_buff_t* pgm_rxw_peek (pgm_rxw_t*const, const uint32_t) PGM_GNUC_WARN_UNUSED_RESULT; PGM_GNUC_INTERNAL const char* pgm_pkt_state_string (const int) PGM_GNUC_WARN_UNUSED_RESULT; PGM_GNUC_INTERNAL const char* pgm_rxw_returns_string (const int) PGM_GNUC_WARN_UNUSED_RESULT; diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/slist.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/slist.h index e71b15d..e71b15d 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/slist.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/slist.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/sn.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/sn.h index 667db0b..a8cd3da 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/sn.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/sn.h @@ -52,7 +52,7 @@ bool pgm_uint32_lt ( ) { pgm_assert (sizeof(int) >= 4); - return ( ((s) - (t)) & PGM_UINT32_SIGN_BIT ); + return ((s) - (t)) & PGM_UINT32_SIGN_BIT; } static inline @@ -63,7 +63,7 @@ pgm_uint32_lte ( ) { pgm_assert (sizeof(int) >= 4); - return ( ((s) == (t)) || ( ((s) - (t)) & PGM_UINT32_SIGN_BIT ) ); + return ((s) == (t)) || ( ((s) - (t)) & PGM_UINT32_SIGN_BIT ); } static inline @@ -74,7 +74,7 @@ pgm_uint32_gt ( ) { pgm_assert (sizeof(int) >= 4); - return ( ((t) - (s)) & PGM_UINT32_SIGN_BIT ); + return ((t) - (s)) & PGM_UINT32_SIGN_BIT; } static inline @@ -85,7 +85,7 @@ pgm_uint32_gte ( ) { pgm_assert (sizeof(int) >= 4); - return ( ((s) == (t)) || ( ((t) - (s)) & PGM_UINT32_SIGN_BIT ) ); + return ((s) == (t)) || ( ((t) - (s)) & PGM_UINT32_SIGN_BIT ); } /* 64 bit */ @@ -98,15 +98,13 @@ pgm_uint64_lt ( { if (sizeof(int) == 4) { - return ( - ( ((s) - (t)) & PGM_UINT64_SIGN_BIT ) - > 0 /* need to force boolean conversion when int = 32bits */ - ); +/* need to force boolean conversion when int = 32bits */ + return ( ((s) - (t)) & PGM_UINT64_SIGN_BIT ) != 0; } else { pgm_assert (sizeof(int) >= 8); - return ( ((s) - (t)) & PGM_UINT64_SIGN_BIT ); + return ( ((s) - (t)) & PGM_UINT64_SIGN_BIT ) != 0; } } @@ -119,19 +117,15 @@ pgm_uint64_lte ( { if (sizeof(int) == 4) { - return ( - ( (s) == (t) ) - || - ( - ( ((s) - (t)) & PGM_UINT64_SIGN_BIT ) - > 0 /* need to force boolean conversion when int = 32bits */ - ) - ); +/* need to force boolean conversion when int = 32bits */ + return ( (s) == (t) ) + || + ( ( ((s) - (t)) & PGM_UINT64_SIGN_BIT ) != 0 ); } else { pgm_assert (sizeof(int) >= 8); - return ( ((s) == (t)) || ( ((s) - (t)) & PGM_UINT64_SIGN_BIT ) ); + return ( ((s) == (t)) || ( ((s) - (t)) & PGM_UINT64_SIGN_BIT ) ) != 0; } } @@ -144,15 +138,13 @@ pgm_uint64_gt ( { if (sizeof(int) == 4) { - return ( - ( ((t) - (s)) & PGM_UINT64_SIGN_BIT ) - > 0 /* need to force boolean conversion when int = 32bits */ - ); +/* need to force boolean conversion when int = 32bits */ + return ( ((t) - (s)) & PGM_UINT64_SIGN_BIT ) != 0; } else { pgm_assert (sizeof(int) >= 8); - return ( ((t) - (s)) & PGM_UINT64_SIGN_BIT ); + return ( ((t) - (s)) & PGM_UINT64_SIGN_BIT ) != 0; } } @@ -165,19 +157,15 @@ pgm_uint64_gte ( { if (sizeof(int) == 4) { - return ( - ( (s) == (t) ) - || - ( - ( ((t) - (s)) & PGM_UINT64_SIGN_BIT ) - > 0 /* need to force boolean conversion when int = 32bits */ - ) - ); +/* need to force boolean conversion when int = 32bits */ + return ( (s) == (t) ) + || + ( ( ((t) - (s)) & PGM_UINT64_SIGN_BIT ) != 0 ); } else { pgm_assert (sizeof(int) >= 8); - return ( ((s) == (t)) || ( ((t) - (s)) & PGM_UINT64_SIGN_BIT ) ); + return ( ((s) == (t)) || ( ((t) - (s)) & PGM_UINT64_SIGN_BIT ) ) != 0; } } diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/sockaddr.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/sockaddr.h index cea84c9..715c63f 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/sockaddr.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/sockaddr.h @@ -52,8 +52,8 @@ PGM_BEGIN_DECLS # define pgm_sock_strerror(e) strerror(e) # define pgm_error_from_sock_errno pgm_error_from_errno #else -# define PGM_INVALID_SOCKET INVALID_SOCKET -# define PGM_SOCKET_ERROR SOCKET_ERROR +# define PGM_INVALID_SOCKET (int)INVALID_SOCKET +# define PGM_SOCKET_ERROR (int)SOCKET_ERROR # define pgm_closesocket closesocket # define pgm_sock_errno() WSAGetLastError() # define pgm_sock_strerror(e) pgm_wsastrerror(e) diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/socket.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/socket.h index ee175d8..ee175d8 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/socket.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/socket.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/source.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/source.h index dae417a..5349046 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/source.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/source.h @@ -62,7 +62,7 @@ enum { PGM_PC_SOURCE_MAX }; -PGM_GNUC_INTERNAL bool pgm_send_spm (pgm_sock_t*, int) PGM_GNUC_WARN_UNUSED_RESULT; +PGM_GNUC_INTERNAL bool pgm_send_spm (pgm_sock_t*const, const int) PGM_GNUC_WARN_UNUSED_RESULT; PGM_GNUC_INTERNAL bool pgm_on_deferred_nak (pgm_sock_t*const); PGM_GNUC_INTERNAL bool pgm_on_spmr (pgm_sock_t*const restrict, pgm_peer_t*const restrict, struct pgm_sk_buff_t*const restrict) PGM_GNUC_WARN_UNUSED_RESULT; PGM_GNUC_INTERNAL bool pgm_on_nak (pgm_sock_t*const restrict, struct pgm_sk_buff_t*const restrict) PGM_GNUC_WARN_UNUSED_RESULT; diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/sqn_list.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/sqn_list.h index 4d216ae..4d216ae 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/sqn_list.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/sqn_list.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/string.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/string.h index 8357c2a..8357c2a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/string.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/string.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/thread.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/thread.h index e1484d2..105e9ce 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/thread.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/thread.h @@ -175,8 +175,6 @@ static inline void pgm_rwlock_writer_unlock (pgm_rwlock_t* rwlock) { ReleaseSRWLockExclusive (&rwlock->win32_lock); } #else -PGM_GNUC_INTERNAL void pgm_rwlock_init (pgm_rwlock_t*); -PGM_GNUC_INTERNAL void pgm_rwlock_free (pgm_rwlock_t*); PGM_GNUC_INTERNAL void pgm_rwlock_reader_lock (pgm_rwlock_t*); PGM_GNUC_INTERNAL bool pgm_rwlock_reader_trylock (pgm_rwlock_t*); PGM_GNUC_INTERNAL void pgm_rwlock_reader_unlock(pgm_rwlock_t*); @@ -185,6 +183,9 @@ PGM_GNUC_INTERNAL bool pgm_rwlock_writer_trylock (pgm_rwlock_t*); PGM_GNUC_INTERNAL void pgm_rwlock_writer_unlock (pgm_rwlock_t*); #endif +PGM_GNUC_INTERNAL void pgm_rwlock_init (pgm_rwlock_t*); +PGM_GNUC_INTERNAL void pgm_rwlock_free (pgm_rwlock_t*); + PGM_GNUC_INTERNAL void pgm_thread_init (void); PGM_GNUC_INTERNAL void pgm_thread_shutdown (void); diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/time.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/time.h index 70c0d37..70c0d37 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/time.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/time.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/timer.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/timer.h index 4f900e4..4f900e4 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/timer.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/timer.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/tsi.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/tsi.h index be93e62..be93e62 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/tsi.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/tsi.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/txw.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/txw.h index cf33eb5..650cd6a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/txw.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/txw.h @@ -66,10 +66,13 @@ struct pgm_txw_t { size_t size; /* window content size in bytes */ unsigned alloc; /* length of pdata[] */ #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +/* C99 flexible array, sizeof() invalid */ struct pgm_sk_buff_t* pdata[]; -#elif defined(__cplusplus) +#elif !defined(__STDC_VERSION__) || defined(__cplusplus) +/* C90 and older */ struct pgm_sk_buff_t* pdata[1]; #else +/* GNU C variable-length object */ struct pgm_sk_buff_t* pdata[0]; #endif }; diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/impl/wsastrerror.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/wsastrerror.h index 1be4ef2..1be4ef2 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/impl/wsastrerror.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/wsastrerror.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/atomic.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/atomic.h index 15a5272..60349f7 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/atomic.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/atomic.h @@ -40,7 +40,7 @@ pgm_atomic_exchange_and_add32 ( : "0" (val), "m" (*atomic) : "memory", "cc" ); return result; -#elif defined( __SUNPRO_C ) && (defined( __i386 ) || defined( __amd64 )) +#elif (defined( __SUNPRO_C ) || defined( __SUNPRO_CC )) && (defined( __i386 ) || defined( __amd64 )) uint32_t result = val; asm volatile ( "lock\n\t" "xaddl %0, %1" @@ -71,7 +71,7 @@ pgm_atomic_add32 ( : "=m" (*atomic) : "ir" (val), "m" (*atomic) : "memory", "cc" ); -#elif defined( __SUNPRO_C ) && (defined( __i386 ) || defined( __amd64 )) +#elif (defined( __SUNPRO_C ) || defined( __SUNPRO_CC )) && (defined( __i386 ) || defined( __amd64 )) asm volatile ( "lock\n\t" "addl %1, %0" :: "r" (val), "m" (*atomic) ); @@ -90,7 +90,7 @@ pgm_atomic_inc32 ( volatile uint32_t* atomic ) { -#if (defined( __GNUC__ ) && (defined( __i386__ ) || defined( __x86_64__ ))) || (defined( __SUNPRO_C ) && (defined( __i386 ) || defined( __amd64 ))) +#if (defined( __GNUC__ ) && (defined( __i386__ ) || defined( __x86_64__ ))) || ((defined( __SUNPRO_C ) || defined( __SUNPRO_CC )) && (defined( __i386 ) || defined( __amd64 ))) pgm_atomic_add32 (atomic, 1); #elif defined( sun ) atomic_inc_32 (atomic); @@ -107,7 +107,7 @@ pgm_atomic_dec32 ( volatile uint32_t* atomic ) { -#if (defined( __GNUC__ ) && (defined( __i386__ ) || defined( __x86_64__ ))) || (defined( __SUNPRO_C ) && (defined( __i386 ) || defined( __amd64 ))) +#if (defined( __GNUC__ ) && (defined( __i386__ ) || defined( __x86_64__ ))) || ((defined( __SUNPRO_C ) || defined( __SUNPRO_CC )) && (defined( __i386 ) || defined( __amd64 ))) pgm_atomic_add32 (atomic, (uint32_t)-1); #elif defined( sun ) atomic_dec_32 (atomic); diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/backtrace.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/backtrace.h index 24f8469..24f8469 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/backtrace.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/backtrace.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/engine.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/engine.h index 43115e8..43115e8 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/engine.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/engine.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/error.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/error.h index c87755c..3d77290 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/error.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/error.h @@ -93,7 +93,7 @@ struct pgm_error_t }; void pgm_error_free (pgm_error_t*); -void pgm_set_error (pgm_error_t**restrict, int, int, const char*restrict, ...) PGM_GNUC_PRINTF (4, 5); +void pgm_set_error (pgm_error_t**restrict, const int, const int, const char*restrict, ...) PGM_GNUC_PRINTF (4, 5); void pgm_propagate_error (pgm_error_t**restrict, pgm_error_t*restrict); void pgm_clear_error (pgm_error_t**); void pgm_prefix_error (pgm_error_t**restrict, const char*restrict, ...) PGM_GNUC_PRINTF (2, 3); diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/gsi.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/gsi.h index 938214a..86d2921 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/gsi.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/gsi.h @@ -36,6 +36,8 @@ struct pgm_gsi_t { uint8_t identifier[6]; }; +PGM_STATIC_ASSERT(sizeof(struct pgm_gsi_t) == 6); + bool pgm_gsi_create_from_hostname (pgm_gsi_t*restrict, pgm_error_t**restrict); bool pgm_gsi_create_from_addr (pgm_gsi_t*restrict, pgm_error_t**restrict); bool pgm_gsi_create_from_data (pgm_gsi_t*restrict, const uint8_t*restrict, const size_t); diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/http.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/http.h index 5c65d15..5c65d15 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/http.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/http.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/if.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/if.h index 814d235..814d235 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/if.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/if.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/ip/pgm.hh b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/ip/pgm.hh index a5e260f..a5e260f 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/ip/pgm.hh +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/ip/pgm.hh diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/ip/pgm_endpoint.hh b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/ip/pgm_endpoint.hh index 1114719..1114719 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/ip/pgm_endpoint.hh +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/ip/pgm_endpoint.hh diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/list.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/list.h index b91abc9..b91abc9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/list.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/list.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/log.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/log.h index 2b6c036..2b6c036 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/log.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/log.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/macros.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/macros.h index 8808ccb..da7e4d7 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/macros.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/macros.h @@ -106,7 +106,7 @@ # endif #else /* !__GNUC__ */ # define PGM_GNUC_WARN_UNUSED_RESULT -# if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) && defined(CONFIG_HAVE_DSO_VISIBILITY) +# if ((defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)) || (defined(__SUNPRO_CC) && (__SUNPRO_CC >= 0x550))) && defined(CONFIG_HAVE_DSO_VISIBILITY) # define PGM_GNUC_INTERNAL __hidden # else # define PGM_GNUC_INTERNAL diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/mem.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/mem.h index eea31fe..eea31fe 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/mem.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/mem.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/messages.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/messages.h index 6a00b8f..6a00b8f 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/messages.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/messages.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/msgv.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/msgv.h index f5effcb..f5effcb 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/msgv.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/msgv.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/packet.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/packet.h index b1bb639..fb1c13a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/packet.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/packet.h @@ -216,10 +216,13 @@ struct pgm_opt_fragment { struct pgm_opt_nak_list { uint8_t opt_reserved; /* reserved */ #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +/* C99 flexible array, sizeof() invalid */ uint32_t opt_sqn[]; /* requested sequence number [62] */ -#elif defined(__cplusplus) +#elif !defined(__STDC_VERSION__) || defined(__cplusplus) +/* C90 and older */ uint32_t opt_sqn[1]; #else +/* GNU C variable-length object */ uint32_t opt_sqn[0]; #endif }; diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/pgm.h index a122f48..a122f48 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/pgm.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm.hh b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/pgm.hh index fc3476f..fc3476f 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm.hh +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/pgm.hh diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm_socket.hh b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/pgm_socket.hh index 9a3f11b..87a5609 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/pgm_socket.hh +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/pgm_socket.hh @@ -88,15 +88,15 @@ public: } /// Set a socket option. - bool set_option (int optname, const void* optval, ::socklen_t optlen) + bool set_option (int level, int optname, const void* optval, ::socklen_t optlen) { - return pgm_setsockopt (this->native_type_, optname, optval, optlen); + return pgm_setsockopt (this->native_type_, level, optname, optval, optlen); } /// Get a socket option. - bool get_option (int optname, void* optval, ::socklen_t* optlen) + bool get_option (int level, int optname, void* optval, ::socklen_t* optlen) { - return pgm_getsockopt (this->native_type_, optname, optval, optlen); + return pgm_getsockopt (this->native_type_, level, optname, optval, optlen); } /// Get the local endpoint. diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/signal.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/signal.h index 546fb7e..546fb7e 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/signal.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/signal.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/skbuff.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/skbuff.h index 0701dfb..06f1264 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/skbuff.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/skbuff.h @@ -87,6 +87,9 @@ pgm_alloc_skb ( struct pgm_sk_buff_t* skb; skb = (struct pgm_sk_buff_t*)pgm_malloc (size + sizeof(struct pgm_sk_buff_t)); +/* Requires fast FSB to test + pgm_prefetchw (skb); + */ if (PGM_UNLIKELY(pgm_mem_gc_friendly)) { memset (skb, 0, size + sizeof(struct pgm_sk_buff_t)); skb->zero_padded = 1; @@ -229,6 +232,8 @@ pgm_skb_zero_pad ( const uint16_t len ) { +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) +/* C99 version */ if (skb->zero_padded) return; @@ -236,6 +241,16 @@ pgm_skb_zero_pad ( if (tailroom > 0) memset (skb->tail, 0, tailroom); skb->zero_padded = 1; +#else +/* C89 version */ + const uint16_t tailroom = MIN(pgm_skb_tailroom (skb), len); + if (skb->zero_padded) + return; + + if (tailroom > 0) + memset (skb->tail, 0, tailroom); + skb->zero_padded = 1; +#endif } PGM_END_DECLS diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/snmp.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/snmp.h index 922f4e2..922f4e2 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/snmp.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/snmp.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/socket.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/socket.h index f3a2360..1e32af7 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/socket.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/socket.h @@ -78,6 +78,7 @@ struct pgm_pgmccinfo_t { /* socket options */ enum { + PGM_SEND_SOCK = 0x2000, PGM_RECV_SOCK, PGM_REPAIR_SOCK, PGM_PENDING_SOCK, @@ -86,11 +87,12 @@ enum { PGM_RATE_REMAIN, PGM_IP_ROUTER_ALERT, PGM_MTU, + PGM_MSSS, + PGM_MSS, + PGM_PDU, PGM_MULTICAST_LOOP, PGM_MULTICAST_HOPS, PGM_TOS, - PGM_SNDBUF, - PGM_RCVBUF, PGM_AMBIENT_SPM, PGM_HEARTBEAT_SPM, PGM_TXW_SQNS, @@ -144,13 +146,13 @@ bool pgm_bind (pgm_sock_t*restrict, const struct pgm_sockaddr_t*const restrict, bool pgm_bind3 (pgm_sock_t*restrict, const struct pgm_sockaddr_t*const restrict, const socklen_t, const struct pgm_interface_req_t*const, const socklen_t, const struct pgm_interface_req_t*const, const socklen_t, pgm_error_t**restrict) PGM_GNUC_WARN_UNUSED_RESULT; bool pgm_connect (pgm_sock_t*restrict, pgm_error_t**restrict) PGM_GNUC_WARN_UNUSED_RESULT; bool pgm_close (pgm_sock_t*, bool); -bool pgm_setsockopt (pgm_sock_t*const restrict, const int, const void*restrict, const socklen_t); -bool pgm_getsockopt (pgm_sock_t*const restrict, const int, void*restrict, socklen_t*restrict); -bool pgm_getaddrinfo (const char*restrict, const struct pgm_addrinfo_t*restrict, struct pgm_addrinfo_t**restrict, pgm_error_t**restrict); +bool pgm_setsockopt (pgm_sock_t*const restrict, const int, const int, const void*restrict, const socklen_t); +bool pgm_getsockopt (pgm_sock_t*const restrict, const int, const int, void*restrict, socklen_t*restrict); +bool pgm_getaddrinfo (const char*restrict, const struct pgm_addrinfo_t*const restrict, struct pgm_addrinfo_t**restrict, pgm_error_t**restrict); void pgm_freeaddrinfo (struct pgm_addrinfo_t*); int pgm_send (pgm_sock_t*const restrict, const void*restrict, const size_t, size_t*restrict); int pgm_sendv (pgm_sock_t*const restrict, const struct pgm_iovec*const restrict, const unsigned, const bool, size_t*restrict); -int pgm_send_skbv (pgm_sock_t*const restrict, struct pgm_sk_buff_t**restrict, const unsigned, const bool, size_t*restrict); +int pgm_send_skbv (pgm_sock_t*const restrict, struct pgm_sk_buff_t**const restrict, const unsigned, const bool, size_t*restrict); int pgm_recvmsg (pgm_sock_t*const restrict, struct pgm_msgv_t*const restrict, const int, size_t*restrict, pgm_error_t**restrict) PGM_GNUC_WARN_UNUSED_RESULT; int pgm_recvmsgv (pgm_sock_t*const restrict, struct pgm_msgv_t*const restrict, const size_t, const int, size_t*restrict, pgm_error_t**restrict) PGM_GNUC_WARN_UNUSED_RESULT; int pgm_recv (pgm_sock_t*const restrict, void*restrict, const size_t, const int, size_t*const restrict, pgm_error_t**restrict) PGM_GNUC_WARN_UNUSED_RESULT; diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/time.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/time.h index 2fd3898..2fd3898 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/time.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/time.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/tsi.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/tsi.h index c33ea3d..d99f090 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/tsi.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/tsi.h @@ -38,6 +38,8 @@ struct pgm_tsi_t { uint16_t sport; /* source port: a random number to help detect session re-starts */ }; +PGM_STATIC_ASSERT(sizeof(struct pgm_tsi_t) == 8); + char* pgm_tsi_print (const pgm_tsi_t*) PGM_GNUC_WARN_UNUSED_RESULT; int pgm_tsi_print_r (const pgm_tsi_t*restrict, char*restrict, size_t); bool pgm_tsi_equal (const void*restrict, const void*restrict) PGM_GNUC_WARN_UNUSED_RESULT; diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/types.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/types.h index 6c1c81b..e8b2d82 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/types.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/types.h @@ -29,15 +29,20 @@ #ifdef _WIN32 # include <ws2tcpip.h> -# define sa_family_t ULONG +# include <winsock2.h> +# ifdef _MSC_VER +# define sa_family_t ADDRESS_FAMILY +# else +# define sa_family_t USHORT +# endif #endif #ifdef _MSC_VER # include <pgm/winint.h> # define bool BOOL # define ssize_t SSIZE_T -# define restrict -#elif !defined( __cplusplus) || (__GNUC__ >= 4) +# define inline __inline +#elif !defined(__cplusplus) || (__GNUC__ >= 4) /* g++ v4 handles C99 headers without complaints */ # include <stdbool.h> # include <stdint.h> @@ -47,6 +52,11 @@ # include <stdint.h> #endif +#if !defined(restrict) || (__STDC_VERSION__ < 199901L) +/* C89 ANSI standard */ +# define restrict +#endif + PGM_BEGIN_DECLS /* nc */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/version.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/version.h index 7928450..7928450 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/version.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/version.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/winint.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/winint.h index 0205cdf..0205cdf 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/winint.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/winint.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/wininttypes.h b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/wininttypes.h index 5daa7f1..5daa7f1 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/include/pgm/wininttypes.h +++ b/3rdparty/openpgm-svn-r1135/pgm/include/pgm/wininttypes.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/indextoaddr.c b/3rdparty/openpgm-svn-r1135/pgm/indextoaddr.c index 479dffd..479dffd 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/indextoaddr.c +++ b/3rdparty/openpgm-svn-r1135/pgm/indextoaddr.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/indextoaddr.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/indextoaddr.c.c89.patch new file mode 100644 index 0000000..4965077 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/indextoaddr.c.c89.patch @@ -0,0 +1,44 @@ +--- indextoaddr.c 2010-05-21 11:34:27.000000000 +0800 ++++ indextoaddr.c89 2010-08-04 12:06:20.000000000 +0800 +@@ -44,7 +44,9 @@ + + if (0 == ifindex) /* any interface or address */ + { ++#pragma warning( disable : 4244 ) + ifsa->sa_family = iffamily; ++#pragma warning( default : 4244 ) + switch (iffamily) { + case AF_INET: + ((struct sockaddr_in*)ifsa)->sin_addr.s_addr = INADDR_ANY; +@@ -61,6 +63,7 @@ + return TRUE; + } + ++ { + struct pgm_ifaddrs_t *ifap, *ifa; + if (!pgm_getifaddrs (&ifap, error)) { + pgm_prefix_error (error, +@@ -74,6 +77,7 @@ + ifa->ifa_addr->sa_family != iffamily) + continue; + ++ { + const unsigned i = pgm_if_nametoindex (iffamily, ifa->ifa_name); + pgm_assert (0 != i); + if (i == ifindex) +@@ -84,6 +88,7 @@ + pgm_freeifaddrs (ifap); + return TRUE; + } ++ } + } + + pgm_set_error (error, +@@ -93,6 +98,7 @@ + ifindex); + pgm_freeifaddrs (ifap); + return FALSE; ++ } + } + + /* eof */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/indextoaddr_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/indextoaddr_unittest.c index 57222d1..7699f9c 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/indextoaddr_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/indextoaddr_unittest.c @@ -20,7 +20,7 @@ */ /* IFF_UP */ -#define _BSD_SOURCE +#define _BSD_SOURCE 1 #include <errno.h> #include <netdb.h> diff --git a/3rdparty/openpgm-svn-r1085/pgm/indextoname.c b/3rdparty/openpgm-svn-r1135/pgm/indextoname.c index c4043ef..c4043ef 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/indextoname.c +++ b/3rdparty/openpgm-svn-r1135/pgm/indextoname.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/indextoname.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/indextoname.c.c89.patch new file mode 100644 index 0000000..307ec77 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/indextoname.c.c89.patch @@ -0,0 +1,29 @@ +--- indextoname.c 2010-05-21 11:35:23.000000000 +0800 ++++ indextoname.c89 2010-08-05 14:12:26.000000000 +0800 +@@ -39,13 +39,25 @@ + return if_indextoname (ifindex, ifname); + #else + pgm_return_val_if_fail (NULL != ifname, NULL); ++ { + +- MIB_IFROW ifRow = { .dwIndex = ifindex }; ++ MIB_IFROW ifRow; ++ ifRow.dwIndex = ifindex; ++ { + const DWORD dwRetval = GetIfEntry (&ifRow); + if (NO_ERROR != dwRetval) + return NULL; ++#ifdef _MSC_VER ++ { ++ int i; ++ wcstombs_s (&i, ifname, IF_NAMESIZE, ifRow.wszName, _TRUNCATE); ++ } ++#else + strcpy (ifname, (char*)ifRow.wszName); ++#endif + return ifname; ++ } ++ } + #endif /* _WIN32 */ + } + diff --git a/3rdparty/openpgm-svn-r1085/pgm/inet_network.c b/3rdparty/openpgm-svn-r1135/pgm/inet_network.c index 8cac34b..8cac34b 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/inet_network.c +++ b/3rdparty/openpgm-svn-r1135/pgm/inet_network.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/inet_network.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/inet_network.c.c89.patch new file mode 100644 index 0000000..3dbe298 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/inet_network.c.c89.patch @@ -0,0 +1,76 @@ +--- inet_network.c 2010-05-21 11:32:20.000000000 +0800 ++++ inet_network.c89 2010-08-04 12:18:21.000000000 +0800 +@@ -70,6 +70,7 @@ + pgm_debug ("pgm_inet_network (s:\"%s\" in:%p)", + s, (const void*)in); + ++ { + const char *p = s; + unsigned val = 0; + int shift = 24; +@@ -121,13 +122,16 @@ + //g_trace ("bit mask %i", val); + + /* zero out host bits */ +- const struct in_addr netaddr = { .s_addr = cidr_to_netmask (val) }; ++ { ++ struct in_addr netaddr; ++ netaddr.s_addr = cidr_to_netmask (val); + #ifdef INET_NETWORK_DEBUG + { + g_debug ("netaddr %s", inet_ntoa (netaddr)); + } + #endif + in->s_addr &= netaddr.s_addr; ++ } + return 0; + + } else if (*p == 'x' || *p == 'X') { /* skip number, e.g. 1.x.x.x */ +@@ -145,6 +149,7 @@ + + in->s_addr |= val << shift; + return 0; ++ } + } + + /* Converts a numbers-and-dots notation string into an IPv6 network number. +@@ -174,6 +179,7 @@ + * as we are dealing with network addresses IPv6 zone indices are not important + * so we can use the inet_xtoy functions. + */ ++ { + char s2[INET6_ADDRSTRLEN]; + const char *p = s; + char* p2 = s2; +@@ -202,6 +208,7 @@ + #endif + + p++; ++ { + unsigned val = 0; + while (*p) + { +@@ -222,15 +229,22 @@ + pgm_debug ("subnet size %i", val); + + /* zero out host bits */ ++ { + const unsigned suffix_length = 128 - val; +- for (int i = suffix_length, j = 15; i > 0; i -= 8, --j) ++ { ++ int i, j; ++ for (i = suffix_length, j = 15; i > 0; i -= 8, --j) + { + in6->s6_addr[ j ] &= i >= 8 ? 0x00 : (unsigned)(( 0xffU << i ) & 0xffU ); + } ++ } + + pgm_debug ("effective IPv6 network address after subnet mask: %s", pgm_inet_ntop(AF_INET6, in6, s2, sizeof(s2))); + + return 0; ++ } ++ } ++ } + } + + /* eof */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/inet_network_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/inet_network_unittest.c index 2739215..2739215 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/inet_network_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/inet_network_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/ip_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/ip_unittest.c index 48bb601..692fb55 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/ip_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/ip_unittest.c @@ -351,6 +351,11 @@ make_master_suite (void) int main (void) { + if (0 != getuid()) { + fprintf (stderr, "This test requires super-user privileges to run.\n"); + return EXIT_FAILURE; + } + SRunner* sr = srunner_create (make_master_suite ()); srunner_add_suite (sr, make_test_suite ()); srunner_run_all (sr, CK_ENV); diff --git a/3rdparty/openpgm-svn-r1085/pgm/list.c b/3rdparty/openpgm-svn-r1135/pgm/list.c index 7b22f17..7b22f17 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/list.c +++ b/3rdparty/openpgm-svn-r1135/pgm/list.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/log.c b/3rdparty/openpgm-svn-r1135/pgm/log.c index af2aec5..af2aec5 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/log.c +++ b/3rdparty/openpgm-svn-r1135/pgm/log.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/math.c b/3rdparty/openpgm-svn-r1135/pgm/math.c index c2a1b4e..c2a1b4e 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/math.c +++ b/3rdparty/openpgm-svn-r1135/pgm/math.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/math.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/math.c.c89.patch new file mode 100644 index 0000000..f6746fc --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/math.c.c89.patch @@ -0,0 +1,16 @@ +--- math.c 2010-05-21 11:32:22.000000000 +0800 ++++ math.c89 2010-08-03 17:25:54.000000000 +0800 +@@ -66,9 +66,12 @@ + unsigned + pgm_spaced_primes_closest (unsigned num) + { +- for (unsigned i = 0; i < PGM_N_ELEMENTS(primes); i++) ++ { ++ unsigned i; ++ for (i = 0; i < PGM_N_ELEMENTS(primes); i++) + if (primes[i] > num) + return primes[i]; ++ } + return primes[PGM_N_ELEMENTS(primes) - 1]; + } + diff --git a/3rdparty/openpgm-svn-r1085/pgm/md5.c b/3rdparty/openpgm-svn-r1135/pgm/md5.c index 03bad97..9761113 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/md5.c +++ b/3rdparty/openpgm-svn-r1135/pgm/md5.c @@ -260,7 +260,7 @@ pgm_md5_process_bytes ( if (len >= 64) { -#if !_STRING_ARCH_unaligned +#ifndef _STRING_ARCH_unaligned /* To check alignment gcc has an appropriate operator. Other compilers don't. */ # if __GNUC__ >= 2 diff --git a/3rdparty/openpgm-svn-r1135/pgm/md5.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/md5.c.c89.patch new file mode 100644 index 0000000..14d8971 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/md5.c.c89.patch @@ -0,0 +1,34 @@ +--- md5.c 2010-05-21 11:32:21.000000000 +0800 ++++ md5.c89 2010-08-04 12:19:52.000000000 +0800 +@@ -92,6 +92,7 @@ + pgm_assert (len > 0); + pgm_assert (NULL != ctx); + ++ { + uint32_t correct_words[16]; + const uint32_t *words = buffer; + const size_t nwords = len / sizeof (uint32_t); +@@ -243,6 +244,7 @@ + ctx->B = B; + ctx->C = C; + ctx->D = D; ++ } + } + + void +@@ -343,6 +345,7 @@ + pgm_assert (NULL != resbuf); + + /* Take yet unprocessed bytes into account. */ ++ { + const uint32_t bytes = ctx->buflen; + size_t pad; + +@@ -363,6 +366,7 @@ + _pgm_md5_process_block (ctx, ctx->buffer, bytes + pad + 8); + + return _pgm_md5_read_ctx (ctx, resbuf); ++ } + } + + /* eof */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/md5_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/md5_unittest.c index 836af1f..836af1f 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/md5_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/md5_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/mem.c b/3rdparty/openpgm-svn-r1135/pgm/mem.c index 85a6dee..ac98fe6 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/mem.c +++ b/3rdparty/openpgm-svn-r1135/pgm/mem.c @@ -21,6 +21,7 @@ #include <ctype.h> #include <stdio.h> +#include <strings.h> #ifdef _WIN32 # define strcasecmp stricmp #endif diff --git a/3rdparty/openpgm-svn-r1135/pgm/mem.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/mem.c.c89.patch new file mode 100644 index 0000000..5673af3 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/mem.c.c89.patch @@ -0,0 +1,145 @@ +--- mem.c 2010-05-23 16:49:21.000000000 +0800 ++++ mem.c89 2010-08-05 12:19:31.000000000 +0800 +@@ -78,16 +78,24 @@ + if (NULL == string) + return result; + ++/* C++ warning completely irrelevant for C */ ++#pragma warning( disable : 4996 ) + if (!strcasecmp (string, "all")) + { +- for (unsigned i = 0; i < nkeys; i++) ++ { ++ unsigned i; ++ for (i = 0; i < nkeys; i++) + result |= keys[i].value; ++ } + } + else if (!strcasecmp (string, "help")) + { + fprintf (stderr, "Supported debug values:"); +- for (unsigned i = 0; i < nkeys; i++) ++ { ++ unsigned i; ++ for (i = 0; i < nkeys; i++) + fprintf (stderr, " %s", keys[i].key); ++ } + fprintf (stderr, "\n"); + } + else +@@ -96,14 +104,18 @@ + const char* q = strpbrk (string, ":;, \t"); + if (!q) + q = string + strlen (string); +- for (unsigned i = 0; i < nkeys; i++) ++ { ++ unsigned i; ++ for (i = 0; i < nkeys; i++) + if (debug_key_matches (keys[i].key, string, q - string)) + result |= keys[i].value; ++ } + string = q; + if (*string) + string++; + } + } ++#pragma warning( default : 4996 ) + return result; + } + +@@ -117,10 +129,27 @@ + if (pgm_atomic_exchange_and_add32 (&mem_ref_count, 1) > 0) + return; + ++ { ++#ifdef _MSC_VER ++/* _dupenv_s is recommended replacement for getenv which is not thread-safe */ ++ char *val; ++ size_t len; ++ errno_t err; ++ unsigned flags; ++ err = _dupenv_s (&val, &len, "PGM_DEBUG"); ++ if (err || 0 == len) { ++ flags = 0; ++ } else { ++ flags = pgm_parse_debug_string (val, keys, PGM_N_ELEMENTS (keys)); ++ free (val); ++ } ++#else + const char *val = getenv ("PGM_DEBUG"); + const unsigned flags = !val ? 0 : pgm_parse_debug_string (val, keys, PGM_N_ELEMENTS (keys)); ++#endif + if (flags & 1) + pgm_mem_gc_friendly = TRUE; ++ } + } + + void +@@ -146,9 +175,15 @@ + if (mem) + return mem; + +- pgm_fatal ("file %s: line %d (%s): failed to allocate %zu bytes", ++#ifdef __PRETTY_FUNCTION__ ++ pgm_fatal ("file %s: line %d (%s): failed to allocate %lu bytes", + __FILE__, __LINE__, __PRETTY_FUNCTION__, + n_bytes); ++#else ++ pgm_fatal ("file %s: line %d): failed to allocate %lu bytes", ++ __FILE__, __LINE__, ++ n_bytes); ++#endif + abort (); + } + return NULL; +@@ -163,9 +198,15 @@ + ) + { + if (SIZE_OVERFLOWS (n_blocks, block_bytes)) { +- pgm_fatal ("file %s: line %d (%s): overflow allocating %zu*%zu bytes", ++#ifdef __PRETTY_FUNCTION__ ++ pgm_fatal ("file %s: line %d (%s): overflow allocating %lu*%lu bytes", + __FILE__, __LINE__, __PRETTY_FUNCTION__, + n_blocks, block_bytes); ++#else ++ pgm_fatal ("file %s: line %d: overflow allocating %lu*%lu bytes", ++ __FILE__, __LINE__, ++ n_blocks, block_bytes); ++#endif + } + return pgm_malloc (n_blocks * block_bytes); + } +@@ -181,9 +222,15 @@ + if (mem) + return mem; + +- pgm_fatal ("file %s: line %d (%s): failed to allocate %zu bytes", ++#ifdef __PRETTY_FUNCTION__ ++ pgm_fatal ("file %s: line %d (%s): failed to allocate %lu bytes", + __FILE__, __LINE__, __PRETTY_FUNCTION__, + n_bytes); ++#else ++ pgm_fatal ("file %s: line %d: failed to allocate %lu bytes", ++ __FILE__, __LINE__, ++ n_bytes); ++#endif + abort (); + } + return NULL; +@@ -201,9 +248,15 @@ + if (mem) + return mem; + +- pgm_fatal ("file %s: line %d (%s): failed to allocate %zu*%zu bytes", ++#ifdef __PRETTY_FUNCTION__ ++ pgm_fatal ("file %s: line %d (%s): failed to allocate %lu*%lu bytes", + __FILE__, __LINE__, __PRETTY_FUNCTION__, + n_blocks, block_bytes); ++#else ++ pgm_fatal ("file %s: line %d: failed to allocate %lu*%lu bytes", ++ __FILE__, __LINE__, ++ n_blocks, block_bytes); ++#endif + abort (); + } + return NULL; diff --git a/3rdparty/openpgm-svn-r1085/pgm/memcheck b/3rdparty/openpgm-svn-r1135/pgm/memcheck index fbfe59c..fbfe59c 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/memcheck +++ b/3rdparty/openpgm-svn-r1135/pgm/memcheck diff --git a/3rdparty/openpgm-svn-r1085/pgm/messages.c b/3rdparty/openpgm-svn-r1135/pgm/messages.c index 9fa281b..2c13662 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/messages.c +++ b/3rdparty/openpgm-svn-r1135/pgm/messages.c @@ -33,7 +33,7 @@ int pgm_min_log_level PGM_GNUC_READ_MOSTLY = PGM_LOG_LEVEL_NORMAL; /* locals */ -static const char log_levels[8][6] = { +static const char log_levels[8][7] = { "Uknown", "Debug", "Trace", diff --git a/3rdparty/openpgm-svn-r1135/pgm/messages.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/messages.c.c89.patch new file mode 100644 index 0000000..157bd40 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/messages.c.c89.patch @@ -0,0 +1,91 @@ +--- messages.c 2010-05-23 16:50:35.000000000 +0800 ++++ messages.c89 2010-08-05 12:18:49.000000000 +0800 +@@ -19,6 +19,9 @@ + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + ++#ifdef _MSC_VER ++# include <io.h> ++#endif + #include <stdarg.h> + #include <stdio.h> + #include <impl/framework.h> +@@ -81,14 +84,37 @@ + + pgm_mutex_init (&messages_mutex); + ++ { ++#ifdef _MSC_VER ++ char* log_mask; ++ size_t len; ++ errno_t err = _dupenv_s (&log_mask, &len, "PGM_LOG_MASK"); ++ if (!err && len > 0) { ++ unsigned int value = 0; ++ if (1 == sscanf_s (log_mask, "0x%4x", &value)) ++ pgm_log_mask = value; ++ free (log_mask); ++ } ++#else + const char* log_mask = getenv ("PGM_LOG_MASK"); + if (NULL != log_mask) { + unsigned int value = 0; + if (1 == sscanf (log_mask, "0x%4x", &value)) + pgm_log_mask = value; + } ++#endif ++ } ++ { ++#ifdef _MSC_VER ++ char *min_log_level; ++ size_t len; ++ errno_t err = _dupenv_s (&min_log_level, &len, "PGM_MIN_LOG_LEVEL"); ++ if (!err && len > 0) ++#else + const char *min_log_level = getenv ("PGM_MIN_LOG_LEVEL"); +- if (NULL != min_log_level) { ++ if (NULL != min_log_level) ++#endif ++ { + switch (min_log_level[0]) { + case 'D': pgm_min_log_level = PGM_LOG_LEVEL_DEBUG; break; + case 'T': pgm_min_log_level = PGM_LOG_LEVEL_TRACE; break; +@@ -99,6 +125,10 @@ + case 'F': pgm_min_log_level = PGM_LOG_LEVEL_FATAL; break; + default: break; + } ++#ifdef _MSC_VER ++ free (min_log_level); ++#endif ++ } + } + } + +@@ -156,15 +186,28 @@ + char tbuf[ 1024 ]; + + pgm_mutex_lock (&messages_mutex); ++ { ++#ifdef _MSC_VER ++ const int offset = sprintf_s (tbuf, sizeof(tbuf), "%s: ", log_level_text (log_level)); ++ vsnprintf_s (tbuf+offset, sizeof(tbuf)-offset, _TRUNCATE, format, args); ++#else + const int offset = sprintf (tbuf, "%s: ", log_level_text (log_level)); + vsnprintf (tbuf+offset, sizeof(tbuf)-offset, format, args); + tbuf[ sizeof(tbuf) ] = '\0'; ++#endif ++ } + if (log_handler) + log_handler (log_level, tbuf, log_handler_closure); + else { + /* ignore return value */ ++#ifdef _MSC_VER ++ const int stdoutfd = _fileno (stdout); ++ _write (stdoutfd, tbuf, strlen (tbuf)); ++ _write (stdoutfd, "\n", 1); ++#else + write (STDOUT_FILENO, tbuf, strlen (tbuf)); + write (STDOUT_FILENO, "\n", 1); ++#endif + } + + pgm_mutex_unlock (&messages_mutex); diff --git a/3rdparty/openpgm-svn-r1085/pgm/mibs/PGM-MIB-petrova-01.txt b/3rdparty/openpgm-svn-r1135/pgm/mibs/PGM-MIB-petrova-01.txt index 28ff72c..28ff72c 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/mibs/PGM-MIB-petrova-01.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/mibs/PGM-MIB-petrova-01.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/mld-semantics.txt b/3rdparty/openpgm-svn-r1135/pgm/mld-semantics.txt index 135400d..135400d 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/mld-semantics.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/mld-semantics.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/msfec.txt b/3rdparty/openpgm-svn-r1135/pgm/msfec.txt index 4b2c23a..4b2c23a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/msfec.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/msfec.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/nametoindex.c b/3rdparty/openpgm-svn-r1135/pgm/nametoindex.c index 28444d1..28444d1 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/nametoindex.c +++ b/3rdparty/openpgm-svn-r1135/pgm/nametoindex.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/nametoindex.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/nametoindex.c.c89.patch new file mode 100644 index 0000000..127eb4a --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/nametoindex.c.c89.patch @@ -0,0 +1,89 @@ +--- nametoindex.c 2010-05-21 11:34:30.000000000 +0800 ++++ nametoindex.c89 2010-08-04 12:57:20.000000000 +0800 +@@ -78,6 +78,7 @@ + + pgm_assert (AF_INET6 != iffamily); + ++ { + DWORD dwRet, ifIndex; + ULONG ulOutBufLen = DEFAULT_BUFFER_SIZE; + PIP_ADAPTER_INFO pAdapterInfo = NULL; +@@ -86,7 +87,9 @@ + /* loop to handle interfaces coming online causing a buffer overflow + * between first call to list buffer length and second call to enumerate. + */ +- for (unsigned i = MAX_TRIES; i; i--) ++ { ++ unsigned i; ++ for (i = MAX_TRIES; i; i--) + { + pgm_debug ("IP_ADAPTER_INFO buffer length %lu bytes.", ulOutBufLen); + pAdapterInfo = (IP_ADAPTER_INFO*)_pgm_heap_alloc (ulOutBufLen); +@@ -98,6 +101,7 @@ + break; + } + } ++ } + + switch (dwRet) { + case ERROR_SUCCESS: /* NO_ERROR */ +@@ -118,7 +122,9 @@ + pAdapter; + pAdapter = pAdapter->Next) + { +- for (IP_ADDR_STRING *pIPAddr = &pAdapter->IpAddressList; ++ { ++ IP_ADDR_STRING *pIPAddr; ++ for (pIPAddr = &pAdapter->IpAddressList; + pIPAddr; + pIPAddr = pIPAddr->Next) + { +@@ -132,11 +138,13 @@ + return ifIndex; + } + } ++ } + } + + if (pAdapterInfo) + _pgm_heap_free (pAdapterInfo); + return 0; ++ } + } + + /* Retrieve adapter index via name. +@@ -155,6 +163,7 @@ + { + pgm_return_val_if_fail (NULL != ifname, 0); + ++ { + ULONG ifIndex; + DWORD dwSize = DEFAULT_BUFFER_SIZE, dwRet; + IP_ADAPTER_ADDRESSES *pAdapterAddresses = NULL, *adapter; +@@ -170,7 +179,9 @@ + /* loop to handle interfaces coming online causing a buffer overflow + * between first call to list buffer length and second call to enumerate. + */ +- for (unsigned i = MAX_TRIES; i; i--) ++ { ++ unsigned i; ++ for (i = MAX_TRIES; i; i--) + { + pAdapterAddresses = (IP_ADAPTER_ADDRESSES*)_pgm_heap_alloc (dwSize); + dwRet = GetAdaptersAddresses (AF_UNSPEC, +@@ -188,6 +199,7 @@ + break; + } + } ++ } + + switch (dwRet) { + case ERROR_SUCCESS: +@@ -218,6 +230,7 @@ + if (pAdapterAddresses) + _pgm_heap_free (pAdapterAddresses); + return 0; ++ } + } + #endif /* _WIN32 */ + diff --git a/3rdparty/openpgm-svn-r1085/pgm/net-snmp.txt b/3rdparty/openpgm-svn-r1135/pgm/net-snmp.txt index 549bcc2..549bcc2 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/net-snmp.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/net-snmp.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/net.c b/3rdparty/openpgm-svn-r1135/pgm/net.c index 5b2f9e9..eb5f403 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/net.c +++ b/3rdparty/openpgm-svn-r1135/pgm/net.c @@ -55,10 +55,11 @@ */ ssize_t -pgm_sendto ( - pgm_sock_t* sock, +pgm_sendto_hops ( + pgm_sock_t* sock, bool use_rate_limit, bool use_router_alert, + int hops, /* -1 == system default */ const void* restrict buf, size_t len, const struct sockaddr* restrict to, @@ -96,6 +97,8 @@ pgm_sendto ( if (!use_router_alert && sock->can_send_data) pgm_mutex_lock (&sock->send_mutex); + if (-1 != hops) + pgm_sockaddr_multicast_hops (send_sock, sock->send_gsr.gsr_group.ss_family, hops); ssize_t sent = sendto (send_sock, buf, len, 0, to, (socklen_t)tolen); pgm_debug ("sendto returned %zd", sent); @@ -148,6 +151,9 @@ pgm_sendto ( } } +/* revert to default value hop limit */ + if (-1 != hops) + pgm_sockaddr_multicast_hops (send_sock, sock->send_gsr.gsr_group.ss_family, sock->hops); if (!use_router_alert && sock->can_send_data) pgm_mutex_unlock (&sock->send_mutex); return sent; diff --git a/3rdparty/openpgm-svn-r1135/pgm/net.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/net.c.c89.patch new file mode 100644 index 0000000..fd1d1f0 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/net.c.c89.patch @@ -0,0 +1,67 @@ +--- net.c 2010-05-21 11:35:44.000000000 +0800 ++++ net.c89 2010-08-04 15:21:42.000000000 +0800 +@@ -72,19 +72,22 @@ + pgm_assert( tolen > 0 ); + + #ifdef NET_DEBUG ++ { + char saddr[INET_ADDRSTRLEN]; + pgm_sockaddr_ntop (to, saddr, sizeof(saddr)); +- pgm_debug ("pgm_sendto (sock:%p use_rate_limit:%s use_router_alert:%s buf:%p len:%zu to:%s [toport:%d] tolen:%d)", ++ pgm_debug ("pgm_sendto (sock:%p use_rate_limit:%s use_router_alert:%s buf:%p len:%lu to:%s [toport:%d] tolen:%d)", + (const void*)sock, + use_rate_limit ? "TRUE" : "FALSE", + use_router_alert ? "TRUE" : "FALSE", + (const void*)buf, +- len, ++ (unsigned long)len, + saddr, + ntohs (((const struct sockaddr_in*)to)->sin_port), + (int)tolen); ++ } + #endif + ++ { + const int send_sock = use_router_alert ? sock->send_with_router_alert_sock : sock->send_sock; + + if (use_rate_limit && +@@ -97,8 +100,9 @@ + if (!use_router_alert && sock->can_send_data) + pgm_mutex_lock (&sock->send_mutex); + ++ { + ssize_t sent = sendto (send_sock, buf, len, 0, to, (socklen_t)tolen); +- pgm_debug ("sendto returned %zd", sent); ++ pgm_debug ("sendto returned %ld", (signed long)sent); + if (sent < 0) { + int save_errno = pgm_sock_errno(); + if (PGM_UNLIKELY(errno != ENETUNREACH && /* Network is unreachable */ +@@ -114,14 +118,14 @@ + }; + const int ready = poll (&p, 1, 500 /* ms */); + #else ++ int ready; + fd_set writefds; ++ struct timeval tv; + FD_ZERO(&writefds); + FD_SET(send_sock, &writefds); +- struct timeval tv = { +- .tv_sec = 0, +- .tv_usec = 500 /* ms */ * 1000 +- }; +- const int ready = select (1, NULL, &writefds, NULL, &tv); ++ tv.tv_sec = 0; ++ tv.tv_usec = 500 /* ms */ * 1000; ++ ready = select (1, NULL, &writefds, NULL, &tv); + #endif /* CONFIG_HAVE_POLL */ + if (ready > 0) + { +@@ -151,6 +155,8 @@ + if (!use_router_alert && sock->can_send_data) + pgm_mutex_unlock (&sock->send_mutex); + return sent; ++ } ++ } + } + + /* socket helper, for setting pipe ends non-blocking diff --git a/3rdparty/openpgm-svn-r1085/pgm/net_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/net_unittest.c index fc684ca..fc684ca 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/net_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/net_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/options.txt b/3rdparty/openpgm-svn-r1135/pgm/options.txt index cb01da0..cb01da0 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/options.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/options.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/packet_parse.c b/3rdparty/openpgm-svn-r1135/pgm/packet_parse.c index 0fad8ca..65c36a9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/packet_parse.c +++ b/3rdparty/openpgm-svn-r1135/pgm/packet_parse.c @@ -20,7 +20,11 @@ */ #define __STDC_FORMAT_MACROS -#include <inttypes.h> +#ifdef _MSC_VER +# include <pgm/wininttypes.h> +#else +# include <inttypes.h> +#endif #include <impl/i18n.h> #include <impl/framework.h> #include <impl/packet_parse.h> @@ -181,7 +185,7 @@ pgm_parse_raw ( /* packets that fail checksum will generally not be passed upstream except with rfc3828 */ -#if PGM_CHECK_IN_CKSUM +#ifdef PGM_CHECK_IN_CKSUM const uint16_t sum = in_cksum (data, packet_length, 0); if (PGM_UNLIKELY(0 != sum)) { const uint16_t ip_sum = ntohs (ip->ip_sum); @@ -236,7 +240,7 @@ pgm_parse_raw ( bool pgm_parse_udp_encap ( - struct pgm_sk_buff_t* restrict skb, /* will be modified */ + struct pgm_sk_buff_t*const restrict skb, /* will be modified */ pgm_error_t** restrict error ) { @@ -261,7 +265,7 @@ pgm_parse_udp_encap ( static bool pgm_parse ( - struct pgm_sk_buff_t* const restrict skb, /* will be modified to calculate checksum */ + struct pgm_sk_buff_t*const restrict skb, /* will be modified to calculate checksum */ pgm_error_t** restrict error ) { @@ -330,7 +334,7 @@ pgm_parse ( bool pgm_verify_spm ( - const struct pgm_sk_buff_t* const skb + const struct pgm_sk_buff_t*const skb ) { /* pre-conditions */ @@ -384,7 +388,7 @@ pgm_verify_spm ( bool pgm_verify_poll ( - const struct pgm_sk_buff_t* const skb + const struct pgm_sk_buff_t*const skb ) { /* pre-conditions */ @@ -424,7 +428,7 @@ pgm_verify_poll ( bool pgm_verify_polr ( - const struct pgm_sk_buff_t* const skb + const struct pgm_sk_buff_t*const skb ) { /* pre-conditions */ @@ -481,7 +485,7 @@ pgm_verify_polr ( bool pgm_verify_nak ( - const struct pgm_sk_buff_t* const skb + const struct pgm_sk_buff_t*const skb ) { /* pre-conditions */ @@ -543,7 +547,7 @@ pgm_verify_nak ( bool pgm_verify_nnak ( - const struct pgm_sk_buff_t* const skb + const struct pgm_sk_buff_t*const skb ) { /* pre-conditions */ @@ -557,7 +561,7 @@ pgm_verify_nnak ( bool pgm_verify_ncf ( - const struct pgm_sk_buff_t* const skb + const struct pgm_sk_buff_t*const skb ) { /* pre-conditions */ @@ -577,7 +581,7 @@ pgm_verify_ncf ( bool pgm_verify_spmr ( - PGM_GNUC_UNUSED const struct pgm_sk_buff_t* skb + PGM_GNUC_UNUSED const struct pgm_sk_buff_t*const skb ) { /* pre-conditions */ @@ -603,7 +607,7 @@ pgm_verify_spmr ( bool pgm_verify_ack ( - PGM_GNUC_UNUSED const struct pgm_sk_buff_t* skb + PGM_GNUC_UNUSED const struct pgm_sk_buff_t*const skb ) { /* pre-conditions */ diff --git a/3rdparty/openpgm-svn-r1135/pgm/packet_parse.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/packet_parse.c.c89.patch new file mode 100644 index 0000000..fad2ec9 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/packet_parse.c.c89.patch @@ -0,0 +1,121 @@ +--- packet_parse.c 2010-08-04 15:32:09.000000000 +0800 ++++ packet_parse.c89 2010-08-04 15:32:40.000000000 +0800 +@@ -122,6 +122,7 @@ + */ + + /* decode IP header */ ++ { + const struct pgm_ip* ip = (struct pgm_ip*)skb->data; + switch (ip->ip_v) { + case 4: { +@@ -147,6 +148,7 @@ + return FALSE; + } + ++ { + const size_t ip_header_length = ip->ip_hl * 4; /* IP header length in 32bit octets */ + if (PGM_UNLIKELY(ip_header_length < sizeof(struct pgm_ip))) + { +@@ -158,6 +160,7 @@ + return FALSE; + } + ++ { + #ifndef CONFIG_HOST_ORDER_IP_LEN + size_t packet_length = ntohs (ip->ip_len); /* total packet length */ + #else +@@ -186,6 +189,7 @@ + /* packets that fail checksum will generally not be passed upstream except with rfc3828 + */ + #if PGM_CHECK_IN_CKSUM ++ { + const uint16_t sum = in_cksum (data, packet_length, 0); + if (PGM_UNLIKELY(0 != sum)) { + const uint16_t ip_sum = ntohs (ip->ip_sum); +@@ -196,9 +200,11 @@ + ip_sum, sum); + return FALSE; + } ++ } + #endif + + /* fragmentation offset, bit 0: 0, bit 1: do-not-fragment, bit 2: more-fragments */ ++ { + #ifndef CONFIG_HOST_ORDER_IP_OFF + const uint16_t offset = ntohs (ip->ip_off); + #else +@@ -236,6 +242,10 @@ + skb->data = skb->pgm_header; + skb->len -= ip_header_length; + return pgm_parse (skb, error); ++ } ++ } ++ } ++ } + } + + bool +@@ -277,6 +287,7 @@ + { + const uint16_t sum = skb->pgm_header->pgm_checksum; + skb->pgm_header->pgm_checksum = 0; ++ { + const uint16_t pgm_sum = pgm_csum_fold (pgm_csum_partial ((const char*)skb->pgm_header, skb->len, 0)); + skb->pgm_header->pgm_checksum = sum; + if (PGM_UNLIKELY(pgm_sum != sum)) { +@@ -287,6 +298,7 @@ + pgm_sum, sum); + return FALSE; + } ++ } + } else { + if (PGM_ODATA == skb->pgm_header->pgm_type || + PGM_RDATA == skb->pgm_header->pgm_type) +@@ -340,6 +352,7 @@ + /* pre-conditions */ + pgm_assert (NULL != skb); + ++ { + const struct pgm_spm* spm = (const struct pgm_spm*)skb->data; + switch (ntohs (spm->spm_nla_afi)) { + /* truncated packet */ +@@ -357,6 +370,7 @@ + } + + return TRUE; ++ } + } + + /* 14.7.1. Poll Request +@@ -394,6 +408,7 @@ + /* pre-conditions */ + pgm_assert (NULL != skb); + ++ { + const struct pgm_poll* poll4 = (const struct pgm_poll*)skb->data; + switch (ntohs (poll4->poll_nla_afi)) { + /* truncated packet */ +@@ -411,6 +426,7 @@ + } + + return TRUE; ++ } + } + + /* 14.7.2. Poll Response +@@ -497,6 +513,7 @@ + if (PGM_UNLIKELY(skb->len < PGM_MIN_NAK_SIZE)) + return FALSE; + ++ { + const struct pgm_nak* nak = (struct pgm_nak*)skb->data; + const uint16_t nak_src_nla_afi = ntohs (nak->nak_src_nla_afi); + uint16_t nak_grp_nla_afi = 0; +@@ -540,6 +557,7 @@ + } + + return TRUE; ++ } + } + + /* 8.3. N-NAK diff --git a/3rdparty/openpgm-svn-r1085/pgm/packet_parse_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/packet_parse_unittest.c index 94b06d2..94b06d2 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/packet_parse_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/packet_parse_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/packet_test.c b/3rdparty/openpgm-svn-r1135/pgm/packet_test.c index 6ac469f..267700a 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/packet_test.c +++ b/3rdparty/openpgm-svn-r1135/pgm/packet_test.c @@ -20,7 +20,11 @@ */ #define __STDC_FORMAT_MACROS -#include <inttypes.h> +#ifdef _MSC_VER +# include <pgm/wininttypes.h> +#else +# include <inttypes.h> +#endif #include <ctype.h> #include <stdio.h> #ifndef _WIN32 diff --git a/3rdparty/openpgm-svn-r1135/pgm/packet_test.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/packet_test.c.c89.patch new file mode 100644 index 0000000..72dbcac --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/packet_test.c.c89.patch @@ -0,0 +1,401 @@ +--- packet_test.c 2010-08-04 15:24:51.000000000 +0800 ++++ packet_test.c89 2010-08-04 15:40:35.000000000 +0800 +@@ -66,12 +66,13 @@ + /* minimum size should be IP header plus PGM header */ + if (len < (sizeof(struct pgm_ip) + sizeof(struct pgm_header))) + { +- printf ("Packet size too small: %zu bytes, expecting at least %zu bytes.\n", ++ printf ("Packet size too small: %lu bytes, expecting at least %lu bytes.\n", + len, sizeof(struct pgm_ip) + sizeof(struct pgm_header)); + return FALSE; + } + + /* decode IP header */ ++ { + const struct pgm_ip* ip = (const struct pgm_ip*)data; + if (ip->ip_v != 4) /* IP version, 4 or 6 */ + { +@@ -80,6 +81,7 @@ + } + printf ("IP "); + ++ { + const size_t ip_header_length = ip->ip_hl * 4; /* IP header length in 32bit octets */ + if (ip_header_length < sizeof(struct pgm_ip)) + { +@@ -87,6 +89,7 @@ + return FALSE; + } + ++ { + size_t packet_length = ntohs(ip->ip_len); /* total packet length */ + + /* ip_len can equal packet_length - ip_header_length in FreeBSD/NetBSD +@@ -109,6 +112,7 @@ + return FALSE; + } + ++ { + const uint16_t offset = ntohs(ip->ip_off); + + /* 3 bits routing priority, 4 bits type of service: delay, throughput, reliability, cost */ +@@ -135,7 +139,7 @@ + (offset & 0x1fff) * 8, + ((offset & IP_DF) ? "DF" : ""), + ((offset & IP_MF) ? "+" : "")); +- printf (", length %zu", packet_length); ++ printf (", length %lu", packet_length); + + /* IP options */ + if ((ip_header_length - sizeof(struct pgm_ip)) > 0) { +@@ -146,6 +150,7 @@ + + /* packets that fail checksum will generally not be passed upstream except with rfc3828 + */ ++ { + const uint16_t ip_sum = pgm_inet_checksum(data, packet_length, 0); + if (ip_sum != 0) { + const uint16_t encoded_ip_sum = ntohs(ip->ip_sum); +@@ -176,6 +181,7 @@ + * | Type specific data ... + * +-+-+-+-+-+-+-+-+-+- ... + */ ++ { + const struct pgm_header* pgm_header = (const struct pgm_header*)((const char*)data + ip_header_length); + const size_t pgm_length = packet_length - ip_header_length; + +@@ -227,6 +233,7 @@ + } + + /* now decode PGM packet types */ ++ { + const void* pgm_data = pgm_header + 1; + const size_t pgm_data_length = pgm_length - sizeof(pgm_header); /* can equal zero for SPMR's */ + +@@ -246,6 +253,13 @@ + } + + return err; ++ } ++ } ++ } ++ } ++ } ++ } ++ } + } + + /* 8.1. Source Path Messages (SPM) +@@ -293,6 +307,7 @@ + return FALSE; + } + ++ { + const struct pgm_spm * spm = (const struct pgm_spm *)data; + const struct pgm_spm6* spm6 = (const struct pgm_spm6*)data; + const uint16_t spm_nla_afi = ntohs (spm->spm_nla_afi); +@@ -303,6 +318,7 @@ + ntohl(spm->spm_lead), + spm_nla_afi); /* address family indicator */ + ++ { + char s[INET6_ADDRSTRLEN]; + const void* pgm_opt; + size_t pgm_opt_len; +@@ -340,6 +356,8 @@ + + printf ("\n"); + return TRUE; ++ } ++ } + } + + /* 14.7.1. Poll Request +@@ -389,6 +407,7 @@ + return FALSE; + } + ++ { + const struct pgm_poll * poll4 = (const struct pgm_poll *)data; + const struct pgm_poll6* poll6 = (const struct pgm_poll6*)data; + const uint16_t poll_nla_afi = ntohs (poll4->poll_nla_afi); +@@ -399,6 +418,7 @@ + ntohs(poll4->poll_s_type), + poll_nla_afi); /* address family indicator */ + ++ { + char s[INET6_ADDRSTRLEN]; + const void* pgm_opt; + size_t pgm_opt_len; +@@ -463,6 +483,8 @@ + + printf ("\n"); + return TRUE; ++ } ++ } + } + + /* 14.7.2. Poll Response +@@ -498,12 +520,14 @@ + return FALSE; + } + ++ { + const struct pgm_polr* polr = (const struct pgm_polr*)data; + + printf("sqn %" PRIu32 " round %u", + ntohl(polr->polr_sqn), + ntohs(polr->polr_round)); + ++ { + const void* pgm_opt = (const uint8_t*)data + sizeof(struct pgm_polr); + size_t pgm_opt_len = len - sizeof(struct pgm_polr); + +@@ -516,6 +540,8 @@ + + printf ("\n"); + return TRUE; ++ } ++ } + } + + /* 8.2. Data Packet +@@ -553,6 +579,7 @@ + return FALSE; + } + ++ { + const struct pgm_data* odata = (const struct pgm_data*)data; + + printf ("sqn %" PRIu32 " trail %" PRIu32 " [", +@@ -560,6 +587,7 @@ + ntohl(odata->data_trail)); + + /* option extensions */ ++ { + const void* pgm_opt = (const uint8_t*)data + sizeof(struct pgm_data); + size_t pgm_opt_len = len - sizeof(struct pgm_data); + const char* payload = pgm_opt; +@@ -572,6 +600,7 @@ + } + + /* data */ ++ { + const char* end = payload + ntohs (header->pgm_tsdu_length); + while (payload < end) { + if (isprint (*payload)) +@@ -583,6 +612,9 @@ + + printf ("]\n"); + return TRUE; ++ } ++ } ++ } + } + + /* 8.2. Repair Data +@@ -608,6 +640,7 @@ + return FALSE; + } + ++ { + const struct pgm_data* rdata = (const struct pgm_data*)data; + + printf ("sqn %" PRIu32 " trail %" PRIu32 " [", +@@ -615,6 +648,7 @@ + ntohl (rdata->data_trail)); + + /* option extensions */ ++ { + const void* pgm_opt = (const uint8_t*)data + sizeof(struct pgm_data); + size_t pgm_opt_len = len - sizeof(struct pgm_data); + const char* payload = pgm_opt; +@@ -627,6 +661,7 @@ + } + + /* data */ ++ { + const char* end = payload + ntohs (header->pgm_tsdu_length); + while (payload < end) { + if (isprint (*payload)) +@@ -638,6 +673,9 @@ + + printf ("]\n"); + return TRUE; ++ } ++ } ++ } + } + + /* 8.3. NAK +@@ -686,6 +724,7 @@ + return FALSE; + } + ++ { + const struct pgm_nak * nak = (const struct pgm_nak *)data; + const struct pgm_nak6* nak6 = (const struct pgm_nak6*)data; + const uint16_t nak_src_nla_afi = ntohs (nak->nak_src_nla_afi); +@@ -693,6 +732,7 @@ + printf ("sqn %" PRIu32 " src ", + ntohl(nak->nak_sqn)); + ++ { + char s[INET6_ADDRSTRLEN]; + const void* pgm_opt; + size_t pgm_opt_len; +@@ -722,6 +762,7 @@ + return FALSE; + } + ++ { + const uint16_t nak_grp_nla_afi = ntohs (nak6->nak6_grp_nla_afi); + if (nak_src_nla_afi != nak_grp_nla_afi) { + puts ("different source & group afi very wibbly wobbly :("); +@@ -736,6 +777,7 @@ + pgm_inet_ntop (AF_INET6, &nak6->nak6_grp_nla, s, sizeof(s)); + printf ("%s", s); + break; ++ } + } + + default: +@@ -753,6 +795,8 @@ + + printf ("\n"); + return TRUE; ++ } ++ } + } + + /* 8.3. N-NAK +@@ -873,11 +917,15 @@ + + printf ("ACK: "); + ++ { + const struct pgm_ack* ack = (const struct pgm_ack*)data; + char bitmap[33]; + +- for (unsigned i = 31; i; i--) ++ { ++ unsigned i; ++ for (i = 31; i; i--) + bitmap[i] = (ack->ack_bitmap & (1 << i)) ? '1' : '0'; ++ } + bitmap[32] = '\0'; + + printf ("rx_max %" PRIu32 " bitmap [%s] ", +@@ -892,6 +940,7 @@ + + printf ("\n"); + return TRUE; ++ } + } + + +@@ -917,12 +966,14 @@ + return -1; + } + ++ { + const struct pgm_opt_length* opt_len = (const struct pgm_opt_length*)data; + if (opt_len->opt_length != sizeof(struct pgm_opt_length)) { + printf (" bad opt_length length %u\n", (unsigned)opt_len->opt_length); + return -1; + } + ++ { + uint16_t opt_total_length = ntohs (opt_len->opt_total_length); + printf (" total len %u ", opt_total_length); + if (opt_total_length < (sizeof(struct pgm_opt_length) + sizeof(struct pgm_opt_header)) || +@@ -934,6 +985,7 @@ + + /* total length includes opt_length option */ + opt_total_length -= sizeof(struct pgm_opt_length); ++ { + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)(opt_len + 1); + + /* iterate through options (max 16) */ +@@ -1037,6 +1089,9 @@ + } + + return ((const uint8_t*)opt_header - (const uint8_t*)data); ++ } ++ } ++ } + } + + const char* +@@ -1074,22 +1129,30 @@ + services = pgm_hashtable_new (pgm_int_hash, pgm_int_equal); + } + ++ { + const int hash_key = port; + void* service_string = pgm_hashtable_lookup (services, &hash_key); + if (service_string != NULL) { + return service_string; + } + ++ { + struct servent* se = getservbyport (port, "udp"); + if (se == NULL) { + char buf[sizeof("00000")]; +- snprintf(buf, sizeof(buf), "%u", ntohs(port)); ++#ifdef _MSC_VER ++ _snprintf_s (buf, sizeof(buf), _TRUNCATE, "%u", ntohs(port)); ++#else ++ snprintf (buf, sizeof(buf), "%u", ntohs(port)); ++#endif + service_string = pgm_strdup(buf); + } else { + service_string = pgm_strdup(se->s_name); + } + pgm_hashtable_insert (services, &hash_key, service_string); + return service_string; ++ } ++ } + } + + const char* +@@ -1103,12 +1166,14 @@ + hosts = pgm_hashtable_new (pgm_str_hash, pgm_int_equal); + } + ++ { + const int hash_key = (int)ap->s_addr; + void* host_string = pgm_hashtable_lookup (hosts, &hash_key); + if (host_string != NULL) { + return host_string; + } + ++ { + struct hostent* he = gethostbyaddr((const char*)ap, sizeof(struct in_addr), AF_INET); + if (he == NULL) { + struct in_addr in; +@@ -1119,6 +1184,8 @@ + } + pgm_hashtable_insert (hosts, &hash_key, host_string); + return host_string; ++ } ++ } + } + + void +@@ -1130,6 +1197,7 @@ + /* pre-conditions */ + pgm_assert (NULL != ipopt); + ++ { + const char* op = ipopt; + + while (length) +@@ -1157,6 +1225,7 @@ + op += len; + length -= len; + } ++ } + } + + /* eof */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/packet_test_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/packet_test_unittest.c index 7edefbb..7edefbb 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/packet_test_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/packet_test_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/pgmMIB.c b/3rdparty/openpgm-svn-r1135/pgm/pgmMIB.c index 1226c50..1226c50 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/pgmMIB.c +++ b/3rdparty/openpgm-svn-r1135/pgm/pgmMIB.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/pgmMIB_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/pgmMIB_unittest.c index 4cb4672..4cb4672 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/pgmMIB_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/pgmMIB_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/plan.txt b/3rdparty/openpgm-svn-r1135/pgm/plan.txt index b1747ae..b1747ae 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/plan.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/plan.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/queue.c b/3rdparty/openpgm-svn-r1135/pgm/queue.c index 351c7ef..351c7ef 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/queue.c +++ b/3rdparty/openpgm-svn-r1135/pgm/queue.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/rand.c b/3rdparty/openpgm-svn-r1135/pgm/rand.c index 91b71eb..91b71eb 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/rand.c +++ b/3rdparty/openpgm-svn-r1135/pgm/rand.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/rand.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/rand.c.c89.patch new file mode 100644 index 0000000..074a3ef --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/rand.c.c89.patch @@ -0,0 +1,34 @@ +--- rand.c 2010-05-21 11:35:31.000000000 +0800 ++++ rand.c89 2010-08-04 15:44:47.000000000 +0800 +@@ -31,7 +31,7 @@ + + /* locals */ + +-static pgm_rand_t global_rand = { .seed = 0 }; ++static pgm_rand_t global_rand = { 0 }; + static volatile uint32_t rand_ref_count = 0; + static pgm_mutex_t rand_mutex; + +@@ -81,8 +81,10 @@ + return; + } + #endif /* !_WIN32 */ ++ { + const pgm_time_t now = pgm_time_update_now(); + new_rand->seed = (uint32_t)pgm_to_msecs (now); ++ } + } + + /* derived from POSIX.1-2001 example implementation of rand() +@@ -119,9 +121,11 @@ + pgm_mutex_lock (&rand_mutex); + if (PGM_UNLIKELY(!global_rand.seed)) + pgm_rand_create (&global_rand); ++ { + const uint32_t rand_value = pgm_rand_int (&global_rand); + pgm_mutex_unlock (&rand_mutex); + return rand_value; ++ } + } + + int32_t diff --git a/3rdparty/openpgm-svn-r1085/pgm/rate_control.c b/3rdparty/openpgm-svn-r1135/pgm/rate_control.c index 2baceeb..11f9e9b 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/rate_control.c +++ b/3rdparty/openpgm-svn-r1135/pgm/rate_control.c @@ -77,7 +77,7 @@ pgm_rate_check ( const bool is_nonblocking ) { - int new_rate_limit; + int64_t new_rate_limit; /* pre-conditions */ pgm_assert (NULL != bucket); @@ -120,12 +120,12 @@ pgm_rate_check ( bucket->rate_limit = new_rate_limit; bucket->last_rate_check = now; if (bucket->rate_limit < 0) { - int sleep_amount; + ssize_t sleep_amount; do { pgm_thread_yield(); now = pgm_time_update_now(); time_since_last_rate_check = now - bucket->last_rate_check; - sleep_amount = pgm_to_secs (bucket->rate_per_sec * time_since_last_rate_check); + sleep_amount = (ssize_t)pgm_to_secs (bucket->rate_per_sec * time_since_last_rate_check); } while (sleep_amount + bucket->rate_limit < 0); bucket->rate_limit += sleep_amount; bucket->last_rate_check = now; @@ -149,7 +149,7 @@ pgm_rate_remaining ( pgm_spinlock_lock (&bucket->spinlock); const pgm_time_t now = pgm_time_update_now(); const pgm_time_t time_since_last_rate_check = now - bucket->last_rate_check; - const int bucket_bytes = bucket->rate_limit + pgm_to_secs (bucket->rate_per_sec * time_since_last_rate_check) - n; + const int64_t bucket_bytes = bucket->rate_limit + pgm_to_secs (bucket->rate_per_sec * time_since_last_rate_check) - n; pgm_spinlock_unlock (&bucket->spinlock); return bucket_bytes >= 0 ? 0 : (bucket->rate_per_sec / -bucket_bytes); diff --git a/3rdparty/openpgm-svn-r1135/pgm/rate_control.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/rate_control.c.c89.patch new file mode 100644 index 0000000..d779a78 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/rate_control.c.c89.patch @@ -0,0 +1,62 @@ +--- rate_control.c 2010-08-04 15:58:08.000000000 +0800 ++++ rate_control.c89 2010-08-04 15:57:59.000000000 +0800 +@@ -77,7 +77,7 @@ + const bool is_nonblocking + ) + { +- int64_t new_rate_limit; ++ ssize_t new_rate_limit; + + /* pre-conditions */ + pgm_assert (NULL != bucket); +@@ -87,6 +87,7 @@ + return TRUE; + + pgm_spinlock_lock (&bucket->spinlock); ++ { + pgm_time_t now = pgm_time_update_now(); + pgm_time_t time_since_last_rate_check = now - bucket->last_rate_check; + +@@ -95,7 +96,9 @@ + if (time_since_last_rate_check > pgm_msecs(1)) + new_rate_limit = bucket->rate_per_msec; + else { ++#pragma warning( disable : 4244 ) + new_rate_limit = bucket->rate_limit + ((bucket->rate_per_msec * time_since_last_rate_check) / 1000UL); ++#pragma warning( default : 4244 ) + if (new_rate_limit > bucket->rate_per_msec) + new_rate_limit = bucket->rate_per_msec; + } +@@ -105,7 +108,9 @@ + if (time_since_last_rate_check > pgm_secs(1)) + new_rate_limit = bucket->rate_per_sec; + else { ++#pragma warning( disable : 4244 ) + new_rate_limit = bucket->rate_limit + ((bucket->rate_per_sec * time_since_last_rate_check) / 1000000UL); ++#pragma warning( default : 4244 ) + if (new_rate_limit > bucket->rate_per_sec) + new_rate_limit = bucket->rate_per_sec; + } +@@ -132,6 +137,7 @@ + } + pgm_spinlock_unlock (&bucket->spinlock); + return TRUE; ++ } + } + + pgm_time_t +@@ -147,12 +153,14 @@ + return 0; + + pgm_spinlock_lock (&bucket->spinlock); ++ { + const pgm_time_t now = pgm_time_update_now(); + const pgm_time_t time_since_last_rate_check = now - bucket->last_rate_check; + const int64_t bucket_bytes = bucket->rate_limit + pgm_to_secs (bucket->rate_per_sec * time_since_last_rate_check) - n; + pgm_spinlock_unlock (&bucket->spinlock); + + return bucket_bytes >= 0 ? 0 : (bucket->rate_per_sec / -bucket_bytes); ++ } + } + + /* eof */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/rate_control_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/rate_control_unittest.c index 7da5128..7da5128 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/rate_control_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/rate_control_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/receiver.c b/3rdparty/openpgm-svn-r1135/pgm/receiver.c index 8f26353..ea2acea 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/receiver.c +++ b/3rdparty/openpgm-svn-r1135/pgm/receiver.c @@ -20,7 +20,11 @@ */ #define __STDC_FORMAT_MACROS -#include <inttypes.h> +#ifdef _MSC_VER +# include <pgm/wininttypes.h> +#else +# include <inttypes.h> +#endif #include <errno.h> #include <impl/i18n.h> #include <impl/framework.h> @@ -67,7 +71,10 @@ next_ack_rb_expiry ( pgm_assert (NULL != window); pgm_assert (NULL != window->ack_backoff_queue.tail); - const struct pgm_peer_t* peer = (const struct pgm_peer_t*)window->ack_backoff_queue.tail; + const struct pgm_peer_t* peer = (const struct pgm_peer_t*)window->ack_backoff_queue.tail->data; + pgm_assert (NULL != peer); + + pgm_assert (peer->sock->use_pgmcc); return peer->ack_rb_expiry; } @@ -123,6 +130,7 @@ ack_rb_ivl ( { /* pre-conditions */ pgm_assert (NULL != sock); + pgm_assert (sock->use_pgmcc); pgm_assert_cmpuint (sock->ack_bo_ivl, >, 1); return pgm_rand_int_range (&sock->rand_, 1 /* us */, sock->ack_bo_ivl); @@ -191,6 +199,7 @@ _pgm_is_acker ( /* pre-conditions */ pgm_assert (NULL != peer); + pgm_assert (peer->sock->use_pgmcc); pgm_assert (NULL != skb); pgm_assert (NULL != skb->pgm_opt_pgmcc_data); @@ -238,6 +247,9 @@ _pgm_add_ack ( const pgm_time_t ack_rb_expiry ) { + pgm_assert (NULL != peer); + pgm_assert (peer->sock->use_pgmcc); + peer->ack_rb_expiry = ack_rb_expiry; pgm_queue_push_head_link (&peer->window->ack_backoff_queue, &peer->ack_link); } @@ -251,7 +263,10 @@ _pgm_remove_ack ( pgm_peer_t* const restrict peer ) { + pgm_assert (NULL != peer); + pgm_assert (peer->sock->use_pgmcc); pgm_assert (!pgm_queue_is_empty (&peer->window->ack_backoff_queue)); + pgm_queue_unlink (&peer->window->ack_backoff_queue, &peer->ack_link); peer->ack_rb_expiry = 0; } @@ -403,6 +418,9 @@ pgm_new_peer ( sock->ack_c_p); peer->spmr_expiry = now + sock->spmr_expiry; +/* Prepare ack_link */ + peer->ack_link.data = peer; + /* add peer to hash table and linked list */ pgm_rwlock_writer_lock (&sock->peers_lock); pgm_peer_t* entry = _pgm_peer_ref (peer); @@ -942,6 +960,8 @@ send_spmr ( pgm_peer_t* const restrict source ) { + ssize_t sent; + /* pre-conditions */ pgm_assert (NULL != sock); pgm_assert (NULL != source); @@ -963,10 +983,10 @@ send_spmr ( header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); /* send multicast SPMR TTL 1 */ - pgm_sockaddr_multicast_hops (sock->send_sock, sock->send_gsr.gsr_group.ss_family, 1); - ssize_t sent = pgm_sendto (sock, + sent = pgm_sendto_hops (sock, FALSE, /* not rate limited */ FALSE, /* regular socket */ + 1, header, tpdu_length, (struct sockaddr*)&sock->send_gsr.gsr_group, @@ -975,7 +995,6 @@ send_spmr ( return FALSE; /* send unicast SPMR with regular TTL */ - pgm_sockaddr_multicast_hops (sock->send_sock, sock->send_gsr.gsr_group.ss_family, sock->hops); sent = pgm_sendto (sock, FALSE, FALSE, @@ -1239,6 +1258,7 @@ send_ack ( { /* pre-conditions */ pgm_assert (NULL != sock); + pgm_assert (sock->use_pgmcc); pgm_assert (NULL != source); pgm_debug ("send_ack (sock:%p source:%p now:%" PGM_TIME_FORMAT ")", @@ -1290,7 +1310,7 @@ send_ack ( const uint32_t t = source->ack_last_tstamp + pgm_to_msecs( now - source->last_data_tstamp ); opt_pgmcc_feedback->opt_tstamp = htonl (t); pgm_sockaddr_to_nla ((struct sockaddr*)&sock->send_addr, (char*)&opt_pgmcc_feedback->opt_nla_afi); - opt_pgmcc_feedback->opt_loss_rate = htonl (source->window->data_loss); + opt_pgmcc_feedback->opt_loss_rate = htons ((uint16_t)source->window->data_loss); header->pgm_checksum = 0; header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); @@ -1323,6 +1343,7 @@ ack_rb_state ( { /* pre-conditions */ pgm_assert (NULL != peer); + pgm_assert (peer->sock->use_pgmcc); pgm_debug ("ack_rb_state (peer:%p now:%" PGM_TIME_FORMAT ")", (const void*)peer, now); @@ -1633,7 +1654,7 @@ pgm_trace(PGM_LOG_ROLE_NETWORK,_("nak_rpt_expiry in %f seconds."), bool pgm_check_peer_state ( - pgm_sock_t* sock, + pgm_sock_t*const sock, const pgm_time_t now ) { @@ -1668,6 +1689,8 @@ pgm_check_peer_state ( if (window->ack_backoff_queue.tail) { + pgm_assert (sock->use_pgmcc); + if (pgm_time_after_eq (now, next_ack_rb_expiry (window))) if (!ack_rb_state (peer, now)) { return FALSE; @@ -1766,6 +1789,7 @@ pgm_min_receiver_expiry ( if (window->ack_backoff_queue.tail) { + pgm_assert (sock->use_pgmcc); if (pgm_time_after_eq (expiration, next_ack_rb_expiry (window))) expiration = next_ack_rb_expiry (window); } diff --git a/3rdparty/openpgm-svn-r1135/pgm/receiver.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/receiver.c.c89.patch new file mode 100644 index 0000000..a8c3e6d --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/receiver.c.c89.patch @@ -0,0 +1,887 @@ +--- receiver.c 2010-08-05 11:18:06.000000000 +0800 ++++ receiver.c89 2010-08-05 11:39:03.000000000 +0800 +@@ -71,8 +71,10 @@ + pgm_assert (NULL != window); + pgm_assert (NULL != window->ack_backoff_queue.tail); + ++ { + const struct pgm_peer_t* peer = (const struct pgm_peer_t*)window->ack_backoff_queue.tail; + return peer->ack_rb_expiry; ++ } + } + + static inline +@@ -84,9 +86,11 @@ + pgm_assert (NULL != window); + pgm_assert (NULL != window->nak_backoff_queue.tail); + ++ { + const struct pgm_sk_buff_t* skb = (const struct pgm_sk_buff_t*)window->nak_backoff_queue.tail; + const pgm_rxw_state_t* state = (const pgm_rxw_state_t*)&skb->cb; + return state->timer_expiry; ++ } + } + + static inline +@@ -98,9 +102,11 @@ + pgm_assert (NULL != window); + pgm_assert (NULL != window->wait_ncf_queue.tail); + ++ { + const struct pgm_sk_buff_t* skb = (const struct pgm_sk_buff_t*)window->wait_ncf_queue.tail; + const pgm_rxw_state_t* state = (const pgm_rxw_state_t*)&skb->cb; + return state->timer_expiry; ++ } + } + + static inline +@@ -112,9 +118,11 @@ + pgm_assert (NULL != window); + pgm_assert (NULL != window->wait_data_queue.tail); + ++ { + const struct pgm_sk_buff_t* skb = (const struct pgm_sk_buff_t*)window->wait_data_queue.tail; + const pgm_rxw_state_t* state = (const pgm_rxw_state_t*)&skb->cb; + return state->timer_expiry; ++ } + } + + /* calculate ACK_RB_IVL. +@@ -127,9 +135,9 @@ + { + /* pre-conditions */ + pgm_assert (NULL != sock); +- pgm_assert_cmpuint (sock->ack_bo_ivl, >, 1); ++ pgm_assert_cmpuint ((unsigned int)sock->ack_bo_ivl, >, 1); + +- return pgm_rand_int_range (&sock->rand_, 1 /* us */, sock->ack_bo_ivl); ++ return pgm_rand_int_range (&sock->rand_, 1 /* us */, (unsigned int)sock->ack_bo_ivl); + } + + /* calculate NAK_RB_IVL as random time interval 1 - NAK_BO_IVL. +@@ -142,9 +150,9 @@ + { + /* pre-conditions */ + pgm_assert (NULL != sock); +- pgm_assert_cmpuint (sock->nak_bo_ivl, >, 1); ++ pgm_assert_cmpuint ((unsigned int)sock->nak_bo_ivl, >, 1); + +- return pgm_rand_int_range (&sock->rand_, 1 /* us */, sock->nak_bo_ivl); ++ return pgm_rand_int_range (&sock->rand_, 1 /* us */, (unsigned int)sock->nak_bo_ivl); + } + + /* mark sequence as recovery failed. +@@ -162,11 +170,12 @@ + pgm_assert (NULL != sock); + pgm_assert (NULL != peer); + pgm_assert (NULL != skb); +- pgm_assert_cmpuint (now, >=, skb->tstamp); ++ pgm_assert_cmpuint ((unsigned int)now, >=, (unsigned int)skb->tstamp); + + pgm_trace (PGM_LOG_ROLE_RX_WINDOW, _("Lost data #%u due to cancellation."), skb->sequence); + +- const uint32_t fail_time = now - skb->tstamp; ++ { ++ const uint32_t fail_time = (uint32_t)(now - skb->tstamp); + if (!peer->max_fail_time) + peer->max_fail_time = peer->min_fail_time = fail_time; + else if (fail_time > peer->max_fail_time) +@@ -176,6 +185,7 @@ + + pgm_rxw_lost (peer->window, skb->sequence); + PGM_HISTOGRAM_TIMES("Rx.FailTime", fail_time); ++ } + + /* mark receiver window for flushing on next recv() */ + pgm_peer_set_pending (sock, peer); +@@ -214,6 +224,7 @@ + pgm_assert (NULL != skb); + pgm_assert (NULL != skb->pgm_opt_pgmcc_data); + ++ { + const unsigned acker_afi = ntohs (skb->pgm_opt_pgmcc_data->opt_nla_afi); + switch (acker_afi) { + case AFI_IP: +@@ -230,6 +241,7 @@ + } + + return FALSE; ++ } + } + + /* add state for an ACK on a data packet. +@@ -316,6 +328,7 @@ + pgm_assert (NULL != skb); + pgm_assert (NULL != skb->pgm_data); + ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(skb->pgm_data + 1); + bool found_opt = FALSE; + +@@ -351,6 +364,7 @@ + + } while (!(opt_header->opt_type & PGM_OPT_END)); + return found_opt; ++ } + } + + /* a peer in the context of the sock is another party on the network sending PGM +@@ -381,11 +395,13 @@ + pgm_assert (dst_addrlen > 0); + + #ifdef PGM_DEBUG ++ { + char saddr[INET6_ADDRSTRLEN], daddr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop (src_addr, saddr, sizeof(saddr)); + pgm_sockaddr_ntop (dst_addr, daddr, sizeof(daddr)); + pgm_debug ("pgm_new_peer (sock:%p tsi:%s src-addr:%s src-addrlen:%u dst-addr:%s dst-addrlen:%u)", + (void*)sock, pgm_tsi_print (tsi), saddr, (unsigned)src_addrlen, daddr, (unsigned)dst_addrlen); ++ } + #endif + + peer = pgm_new0 (pgm_peer_t, 1); +@@ -409,10 +425,12 @@ + + /* add peer to hash table and linked list */ + pgm_rwlock_writer_lock (&sock->peers_lock); ++ { + pgm_peer_t* entry = _pgm_peer_ref (peer); + pgm_hashtable_insert (sock->peers_hashtable, &peer->tsi, entry); + peer->peers_link.data = peer; + sock->peers_list = pgm_list_prepend_link (sock->peers_list, &peer->peers_link); ++ } + pgm_rwlock_writer_unlock (&sock->peers_lock); + + pgm_timer_lock (sock); +@@ -455,6 +473,7 @@ + pgm_peer_t* peer = sock->peers_pending->data; + if (peer->last_commit && peer->last_commit < sock->last_commit) + pgm_rxw_remove_commit (peer->window); ++ { + const ssize_t peer_bytes = pgm_rxw_readv (peer->window, pmsg, msg_end - *pmsg + 1); + + if (peer->last_cumulative_losses != ((pgm_rxw_t*)peer->window)->cumulative_losses) +@@ -481,6 +500,7 @@ + } + /* clear this reference and move to next */ + sock->peers_pending = pgm_slist_remove_first (sock->peers_pending); ++ } + } + + return retval; +@@ -537,6 +557,7 @@ + pgm_assert (NULL != source); + pgm_assert (NULL != msgv); + ++ { + struct pgm_sk_buff_t* error_skb = pgm_alloc_skb (0); + error_skb->sock = sock; + error_skb->tstamp = pgm_time_update_now (); +@@ -544,6 +565,7 @@ + error_skb->sequence = source->lost_count; + msgv->msgv_skb[0] = error_skb; + msgv->msgv_len = 1; ++ } + } + + /* SPM indicate start of a session, continued presence of a session, or flushing final packets +@@ -573,6 +595,7 @@ + return FALSE; + } + ++ { + const struct pgm_spm* spm = (struct pgm_spm*) skb->data; + const struct pgm_spm6* spm6 = (struct pgm_spm6*)skb->data; + const uint32_t spm_sqn = ntohl (spm->spm_sqn); +@@ -587,6 +610,7 @@ + source->spm_sqn = spm_sqn; + + /* update receive window */ ++ { + const pgm_time_t nak_rb_expiry = skb->tstamp + nak_rb_ivl (sock); + const unsigned naks = pgm_rxw_update (source->window, + ntohl (spm->spm_lead), +@@ -601,6 +625,7 @@ + } + + /* mark receiver window for flushing on next recv() */ ++ { + const pgm_rxw_t* window = source->window; + if (window->cumulative_losses != source->last_cumulative_losses && + !source->pending_link.data) +@@ -610,6 +635,8 @@ + source->last_cumulative_losses = window->cumulative_losses; + pgm_peer_set_pending (sock, source); + } ++ } ++ } + } + else + { /* does not advance SPM sequence number */ +@@ -637,6 +664,7 @@ + return FALSE; + } + /* TODO: check for > 16 options & past packet end */ ++ { + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)opt_len; + do { + opt_header = (const struct pgm_opt_header*)((const char*)opt_header + opt_header->opt_length); +@@ -650,6 +678,7 @@ + return FALSE; + } + ++ { + const uint32_t parity_prm_tgs = ntohl (opt_parity_prm->parity_prm_tgs); + if (PGM_UNLIKELY(parity_prm_tgs < 2 || parity_prm_tgs > 128)) + { +@@ -664,8 +693,10 @@ + source->is_fec_enabled = 1; + pgm_rxw_update_fec (source->window, parity_prm_tgs); + } ++ } + } + } while (!(opt_header->opt_type & PGM_OPT_END)); ++ } + } + + /* either way bump expiration timer */ +@@ -676,6 +707,7 @@ + source->spmr_tstamp = 0; + } + return TRUE; ++ } + } + + /* Multicast peer-to-peer NAK handling, pretty much the same as a NCF but different direction +@@ -705,6 +737,7 @@ + return FALSE; + } + ++ { + const struct pgm_nak* nak = (struct pgm_nak*) skb->data; + const struct pgm_nak6* nak6 = (struct pgm_nak6*)skb->data; + +@@ -718,10 +751,14 @@ + } + + /* NAK_GRP_NLA contains one of our sock receive multicast groups: the sources send multicast group */ ++ { + struct sockaddr_storage nak_grp_nla; + pgm_nla_to_sockaddr ((AF_INET6 == nak_src_nla.ss_family) ? &nak6->nak6_grp_nla_afi : &nak->nak_grp_nla_afi, (struct sockaddr*)&nak_grp_nla); ++ { + bool found = FALSE; +- for (unsigned i = 0; i < sock->recv_gsr_len; i++) ++ { ++ unsigned i; ++ for (i = 0; i < sock->recv_gsr_len; i++) + { + if (pgm_sockaddr_cmp ((struct sockaddr*)&nak_grp_nla, (struct sockaddr*)&sock->recv_gsr[i].gsr_group) == 0) + { +@@ -729,6 +766,7 @@ + break; + } + } ++ } + + if (PGM_UNLIKELY(!found)) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Discarded multicast NAK on multicast group mismatch.")); +@@ -736,6 +774,7 @@ + } + + /* handle as NCF */ ++ { + int status = pgm_rxw_confirm (peer->window, + ntohl (nak->nak_sqn), + skb->tstamp, +@@ -745,6 +784,7 @@ + peer->cumulative_stats[PGM_PC_RECEIVER_SELECTIVE_NAKS_SUPPRESSED]++; + + /* check NAK list */ ++ { + const uint32_t* nak_list = NULL; + unsigned nak_list_len = 0; + if (skb->pgm_header->pgm_options & PGM_OPT_PRESENT) +@@ -765,6 +805,7 @@ + return FALSE; + } + /* TODO: check for > 16 options & past packet end */ ++ { + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)opt_len; + do { + opt_header = (const struct pgm_opt_header*)((const char*)opt_header + opt_header->opt_length); +@@ -775,6 +816,7 @@ + break; + } + } while (!(opt_header->opt_type & PGM_OPT_END)); ++ } + } + + while (nak_list_len) { +@@ -790,6 +832,7 @@ + } + + /* mark receiver window for flushing on next recv() */ ++ { + const pgm_rxw_t* window = peer->window; + if (window->cumulative_losses != peer->last_cumulative_losses && + !peer->pending_link.data) +@@ -800,6 +843,12 @@ + pgm_peer_set_pending (sock, peer); + } + return TRUE; ++ } ++ } ++ } ++ } ++ } ++ } + } + + /* NCF confirming receipt of a NAK from this sock or another on the LAN segment. +@@ -831,6 +880,7 @@ + return FALSE; + } + ++ { + const struct pgm_nak* ncf = (struct pgm_nak*) skb->data; + const struct pgm_nak6* ncf6 = (struct pgm_nak6*)skb->data; + +@@ -847,6 +897,7 @@ + #endif + + /* NCF_GRP_NLA contains our sock multicast group */ ++ { + struct sockaddr_storage ncf_grp_nla; + pgm_nla_to_sockaddr ((AF_INET6 == ncf_src_nla.ss_family) ? &ncf6->nak6_grp_nla_afi : &ncf->nak_grp_nla_afi, (struct sockaddr*)&ncf_grp_nla); + if (PGM_UNLIKELY(pgm_sockaddr_cmp ((struct sockaddr*)&ncf_grp_nla, (struct sockaddr*)&sock->send_gsr.gsr_group) != 0)) +@@ -855,6 +906,7 @@ + return FALSE; + } + ++ { + const pgm_time_t ncf_rdata_ivl = skb->tstamp + sock->nak_rdata_ivl; + const pgm_time_t ncf_rb_ivl = skb->tstamp + nak_rb_ivl(sock); + int status = pgm_rxw_confirm (source->window, +@@ -874,6 +926,7 @@ + } + + /* check NCF list */ ++ { + const uint32_t* ncf_list = NULL; + unsigned ncf_list_len = 0; + if (skb->pgm_header->pgm_options & PGM_OPT_PRESENT) +@@ -894,6 +947,7 @@ + return FALSE; + } + /* TODO: check for > 16 options & past packet end */ ++ { + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)opt_len; + do { + opt_header = (const struct pgm_opt_header*)((const char*)opt_header + opt_header->opt_length); +@@ -904,6 +958,7 @@ + break; + } + } while (!(opt_header->opt_type & PGM_OPT_END)); ++ } + } + + pgm_debug ("NCF contains 1+%d sequence numbers.", ncf_list_len); +@@ -921,6 +976,7 @@ + } + + /* mark receiver window for flushing on next recv() */ ++ { + const pgm_rxw_t* window = source->window; + if (window->cumulative_losses != source->last_cumulative_losses && + !source->pending_link.data) +@@ -931,6 +987,11 @@ + pgm_peer_set_pending (sock, source); + } + return TRUE; ++ } ++ } ++ } ++ } ++ } + } + + /* send SPM-request to a new peer, this packet type has no contents +@@ -953,8 +1014,9 @@ + pgm_debug ("send_spmr (sock:%p source:%p)", + (const void*)sock, (const void*)source); + ++ { + const size_t tpdu_length = sizeof(struct pgm_header); +- char buf[ tpdu_length ]; ++ char* buf = pgm_newa (char, tpdu_length); + struct pgm_header* header = (struct pgm_header*)buf; + memcpy (header->pgm_gsi, &source->tsi.gsi, sizeof(pgm_gsi_t)); + /* dport & sport reversed communicating upstream */ +@@ -968,6 +1030,7 @@ + + /* send multicast SPMR TTL 1 */ + pgm_sockaddr_multicast_hops (sock->send_sock, sock->send_gsr.gsr_group.ss_family, 1); ++ { + ssize_t sent = pgm_sendto (sock, + FALSE, /* not rate limited */ + FALSE, /* regular socket */ +@@ -992,6 +1055,8 @@ + + sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT] += tpdu_length * 2; + return TRUE; ++ } ++ } + } + + /* send selective NAK for one sequence number. +@@ -1014,10 +1079,12 @@ + pgm_debug ("send_nak (sock:%p peer:%p sequence:%" PRIu32 ")", + (void*)sock, (void*)source, sequence); + ++ { + size_t tpdu_length = sizeof(struct pgm_header) + sizeof(struct pgm_nak); + if (AF_INET6 == source->nla.ss_family) + tpdu_length += sizeof(struct pgm_nak6) - sizeof(struct pgm_nak); +- char buf[ tpdu_length ]; ++ { ++ char* buf = pgm_newa (char, tpdu_length); + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_nak* nak = (struct pgm_nak* )(header + 1); + struct pgm_nak6* nak6 = (struct pgm_nak6*)(header + 1); +@@ -1045,6 +1112,7 @@ + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + ++ { + const ssize_t sent = pgm_sendto (sock, + FALSE, /* not rate limited */ + TRUE, /* with router alert */ +@@ -1058,6 +1126,9 @@ + source->cumulative_stats[PGM_PC_RECEIVER_SELECTIVE_NAK_PACKETS_SENT]++; + source->cumulative_stats[PGM_PC_RECEIVER_SELECTIVE_NAKS_SENT]++; + return TRUE; ++ } ++ } ++ } + } + + /* Send a parity NAK requesting on-demand parity packet generation. +@@ -1082,10 +1153,12 @@ + pgm_debug ("send_parity_nak (sock:%p source:%p nak-tg-sqn:%" PRIu32 " nak-pkt-cnt:%" PRIu32 ")", + (void*)sock, (void*)source, nak_tg_sqn, nak_pkt_cnt); + ++ { + size_t tpdu_length = sizeof(struct pgm_header) + sizeof(struct pgm_nak); + if (AF_INET6 == source->nla.ss_family) + tpdu_length += sizeof(struct pgm_nak6) - sizeof(struct pgm_nak); +- char buf[ tpdu_length ]; ++ { ++ char* buf = pgm_newa (char, tpdu_length); + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_nak* nak = (struct pgm_nak* )(header + 1); + struct pgm_nak6* nak6 = (struct pgm_nak6*)(header + 1); +@@ -1112,6 +1185,7 @@ + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + ++ { + const ssize_t sent = pgm_sendto (sock, + FALSE, /* not rate limited */ + TRUE, /* with router alert */ +@@ -1125,6 +1199,9 @@ + source->cumulative_stats[PGM_PC_RECEIVER_PARITY_NAK_PACKETS_SENT]++; + source->cumulative_stats[PGM_PC_RECEIVER_PARITY_NAKS_SENT]++; + return TRUE; ++ } ++ } ++ } + } + + /* A NAK packet with a OPT_NAK_LIST option extension +@@ -1148,17 +1225,23 @@ + pgm_assert_cmpuint (sqn_list->len, <=, 63); + + #ifdef RECEIVER_DEBUG ++ { + char list[1024]; + sprintf (list, "%" PRIu32, sqn_list->sqn[0]); +- for (unsigned i = 1; i < sqn_list->len; i++) { ++ { ++ unsigned i; ++ for (i = 1; i < sqn_list->len; i++) { + char sequence[2 + strlen("4294967295")]; + sprintf (sequence, " %" PRIu32, sqn_list->sqn[i]); + strcat (list, sequence); + } ++ } + pgm_debug("send_nak_list (sock:%p source:%p sqn-list:[%s])", + (const void*)sock, (const void*)source, list); ++ } + #endif + ++ { + size_t tpdu_length = sizeof(struct pgm_header) + + sizeof(struct pgm_nak) + + sizeof(struct pgm_opt_length) + /* includes header */ +@@ -1167,9 +1250,11 @@ + ( (sqn_list->len-1) * sizeof(uint32_t) ); + if (AF_INET6 == source->nla.ss_family) + tpdu_length += sizeof(struct pgm_nak6) - sizeof(struct pgm_nak); +- char buf[ tpdu_length ]; ++ { ++ char* buf = pgm_newa (char, tpdu_length); + if (PGM_UNLIKELY(pgm_mem_gc_friendly)) + memset (buf, 0, tpdu_length); ++ { + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_nak* nak = (struct pgm_nak* )(header + 1); + struct pgm_nak6* nak6 = (struct pgm_nak6*)(header + 1); +@@ -1193,6 +1278,7 @@ + (AF_INET6 == source->nla.ss_family) ? (char*)&nak6->nak6_grp_nla_afi : (char*)&nak->nak_grp_nla_afi); + + /* OPT_NAK_LIST */ ++ { + struct pgm_opt_length* opt_len = (AF_INET6 == source->nla.ss_family) ? (struct pgm_opt_length*)(nak6 + 1) : (struct pgm_opt_length*)(nak + 1); + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); +@@ -1200,19 +1286,25 @@ + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_nak_list) + + ( (sqn_list->len-1) * sizeof(uint32_t) ) ); ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_NAK_LIST | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_nak_list) + + ( (sqn_list->len-1) * sizeof(uint32_t) ); ++ { + struct pgm_opt_nak_list* opt_nak_list = (struct pgm_opt_nak_list*)(opt_header + 1); + opt_nak_list->opt_reserved = 0; + +- for (unsigned i = 1; i < sqn_list->len; i++) ++ { ++ unsigned i; ++ for (i = 1; i < sqn_list->len; i++) + opt_nak_list->opt_sqn[i-1] = htonl (sqn_list->sqn[i]); ++ } + + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + ++ { + const ssize_t sent = pgm_sendto (sock, + FALSE, /* not rate limited */ + FALSE, /* regular socket */ +@@ -1226,6 +1318,13 @@ + source->cumulative_stats[PGM_PC_RECEIVER_SELECTIVE_NAK_PACKETS_SENT]++; + source->cumulative_stats[PGM_PC_RECEIVER_SELECTIVE_NAKS_SENT] += 1 + sqn_list->len; + return TRUE; ++ } ++ } ++ } ++ } ++ } ++ } ++ } + } + + /* send ACK upstream to source +@@ -1248,6 +1347,7 @@ + pgm_debug ("send_ack (sock:%p source:%p now:%" PGM_TIME_FORMAT ")", + (const void*)sock, (const void*)source, now); + ++ { + size_t tpdu_length = sizeof(struct pgm_header) + + sizeof(struct pgm_ack) + + sizeof(struct pgm_opt_length) + /* includes header */ +@@ -1255,9 +1355,11 @@ + sizeof(struct pgm_opt_pgmcc_feedback); + if (AF_INET6 == sock->send_addr.ss_family) + tpdu_length += sizeof(struct pgm_opt6_pgmcc_feedback) - sizeof(struct pgm_opt_pgmcc_feedback); +- char buf[ tpdu_length ]; ++ { ++ char* buf = pgm_newa (char, tpdu_length); + if (PGM_UNLIKELY(pgm_mem_gc_friendly)) + memset (buf, 0, tpdu_length); ++ { + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_ack* ack = (struct pgm_ack*)(header + 1); + memcpy (header->pgm_gsi, &source->tsi.gsi, sizeof(pgm_gsi_t)); +@@ -1274,6 +1376,7 @@ + ack->ack_bitmap = htonl (source->window->bitmap); + + /* OPT_PGMCC_FEEDBACK */ ++ { + struct pgm_opt_length* opt_len = (struct pgm_opt_length*)(ack + 1); + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); +@@ -1282,16 +1385,19 @@ + (AF_INET6 == sock->send_addr.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_feedback) : + sizeof(struct pgm_opt_pgmcc_feedback) ); ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_PGMCC_FEEDBACK | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + ( (AF_INET6 == sock->send_addr.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_feedback) : + sizeof(struct pgm_opt_pgmcc_feedback) ); ++ { + struct pgm_opt_pgmcc_feedback* opt_pgmcc_feedback = (struct pgm_opt_pgmcc_feedback*)(opt_header + 1); + opt_pgmcc_feedback->opt_reserved = 0; + +- const uint32_t t = source->ack_last_tstamp + pgm_to_msecs( now - source->last_data_tstamp ); ++ { ++ const uint32_t t = (uint32_t)(source->ack_last_tstamp + pgm_to_msecs( now - source->last_data_tstamp )); + opt_pgmcc_feedback->opt_tstamp = htonl (t); + pgm_sockaddr_to_nla ((struct sockaddr*)&sock->send_addr, (char*)&opt_pgmcc_feedback->opt_nla_afi); + opt_pgmcc_feedback->opt_loss_rate = htons ((uint16_t)source->window->data_loss); +@@ -1299,6 +1405,7 @@ + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + ++ { + const ssize_t sent = pgm_sendto (sock, + FALSE, /* not rate limited */ + FALSE, /* regular socket */ +@@ -1311,6 +1418,14 @@ + + source->cumulative_stats[PGM_PC_RECEIVER_ACKS_SENT]++; + return TRUE; ++ } ++ } ++ } ++ } ++ } ++ } ++ } ++ } + } + + /* check all receiver windows for ACKer elections, on expiration send an ACK. +@@ -1331,6 +1446,7 @@ + pgm_debug ("ack_rb_state (peer:%p now:%" PGM_TIME_FORMAT ")", + (const void*)peer, now); + ++ { + pgm_rxw_t* window = peer->window; + pgm_sock_t* sock = peer->sock; + pgm_list_t* list; +@@ -1345,6 +1461,7 @@ + } + + /* have not learned this peers NLA */ ++ { + const bool is_valid_nla = (0 != peer->nla.ss_family); + + while (list) +@@ -1397,6 +1514,8 @@ + pgm_trace (PGM_LOG_ROLE_RX_WINDOW,_("ACK backoff queue empty.")); + } + return TRUE; ++ } ++ } + } + + /* check all receiver windows for packets in BACK-OFF_STATE, on expiration send a NAK. +@@ -1420,10 +1539,11 @@ + pgm_debug ("nak_rb_state (peer:%p now:%" PGM_TIME_FORMAT ")", + (const void*)peer, now); + ++ { + pgm_rxw_t* window = peer->window; + pgm_sock_t* sock = peer->sock; + pgm_list_t* list; +- struct pgm_sqn_list_t nak_list = { .len = 0 }; ++ struct pgm_sqn_list_t nak_list = { 0 }; + + /* send all NAKs first, lack of data is blocking contiguous processing and its + * better to get the notification out a.s.a.p. even though it might be waiting +@@ -1441,6 +1561,7 @@ + pgm_assert (window->nak_backoff_queue.head != NULL); + } + ++ { + unsigned dropped_invalid = 0; + + /* have not learned this peers NLA */ +@@ -1480,6 +1601,7 @@ + } + + /* TODO: parity nak lists */ ++ { + const uint32_t tg_sqn = skb->sequence & tg_sqn_mask; + if ( ( nak_pkt_cnt && tg_sqn == nak_tg_sqn ) || + ( !nak_pkt_cnt && tg_sqn != current_tg_sqn ) ) +@@ -1508,6 +1630,7 @@ + { /* different transmission group */ + break; + } ++ } + } + else + { /* packet expires some time later */ +@@ -1627,6 +1750,8 @@ + pgm_trace (PGM_LOG_ROLE_RX_WINDOW,_("NAK backoff queue empty.")); + } + return TRUE; ++ } ++ } + } + + /* check this peer for NAK state timers, uses the tail of each queue for the nearest +@@ -1650,6 +1775,7 @@ + if (!sock->peers_list) + return TRUE; + ++ { + pgm_list_t* list = sock->peers_list; + do { + pgm_list_t* next = list->next; +@@ -1733,6 +1859,7 @@ + sock->is_pending_read = TRUE; + } + return TRUE; ++ } + } + + /* find the next state expiration time among the socks peers. +@@ -1756,6 +1883,7 @@ + if (!sock->peers_list) + return expiration; + ++ { + pgm_list_t* list = sock->peers_list; + do { + pgm_list_t* next = list->next; +@@ -1796,6 +1924,7 @@ + } while (list); + + return expiration; ++ } + } + + /* check WAIT_NCF_STATE, on expiration move back to BACK-OFF_STATE, on exceeding NAK_NCF_RETRIES +@@ -1814,6 +1943,7 @@ + pgm_debug ("nak_rpt_state (peer:%p now:%" PGM_TIME_FORMAT ")", + (void*)peer, now); + ++ { + pgm_rxw_t* window = peer->window; + pgm_sock_t* sock = peer->sock; + pgm_list_t* list = window->wait_ncf_queue.tail; +@@ -1923,6 +2053,7 @@ + { + pgm_trace (PGM_LOG_ROLE_RX_WINDOW,_("Wait ncf queue empty.")); + } ++ } + } + + /* check WAIT_DATA_STATE, on expiration move back to BACK-OFF_STATE, on exceeding NAK_DATA_RETRIES +@@ -1941,6 +2072,7 @@ + pgm_debug ("nak_rdata_state (peer:%p now:%" PGM_TIME_FORMAT ")", + (const void*)peer, now); + ++ { + pgm_rxw_t* window = peer->window; + pgm_sock_t* sock = peer->sock; + pgm_list_t* list = window->wait_data_queue.tail; +@@ -1956,6 +2088,7 @@ + pgm_list_t* next_list_el = list->prev; + struct pgm_sk_buff_t* rdata_skb = (struct pgm_sk_buff_t*)list; + pgm_assert (NULL != rdata_skb); ++ { + pgm_rxw_state_t* rdata_state = (pgm_rxw_state_t*)&rdata_skb->cb; + + /* check this packet for state expiration */ +@@ -1991,8 +2124,8 @@ + break; + } + +- + list = next_list_el; ++ } + } + + if (window->wait_data_queue.length == 0) +@@ -2029,6 +2162,7 @@ + } else { + pgm_trace (PGM_LOG_ROLE_RX_WINDOW,_("Wait data queue empty.")); + } ++ } + } + + /* ODATA or RDATA packet with any of the following options: +@@ -2055,6 +2189,7 @@ + pgm_debug ("pgm_on_data (sock:%p source:%p skb:%p)", + (void*)sock, (void*)source, (void*)skb); + ++ { + unsigned msg_count = 0; + const pgm_time_t nak_rb_expiry = skb->tstamp + nak_rb_ivl (sock); + pgm_time_t ack_rb_expiry = 0; +@@ -2062,6 +2197,7 @@ + + skb->pgm_data = skb->data; + ++ { + const unsigned opt_total_length = (skb->pgm_header->pgm_options & PGM_OPT_PRESENT) ? ntohs(*(uint16_t*)( (char*)( skb->pgm_data + 1 ) + sizeof(uint16_t))) : 0; + + /* advance data pointer to payload */ +@@ -2076,6 +2212,7 @@ + ack_rb_expiry = skb->tstamp + ack_rb_ivl (sock); + } + ++ { + const int add_status = pgm_rxw_add (source->window, skb, skb->tstamp, nak_rb_expiry); + + /* skb reference is now invalid */ +@@ -2155,6 +2292,9 @@ + pgm_timer_unlock (sock); + } + return TRUE; ++ } ++ } ++ } + } + + /* POLLs are generated by PGM Parents (Sources or Network Elements). +@@ -2182,10 +2322,12 @@ + return FALSE; + } + ++ { + struct pgm_poll* poll4 = (struct pgm_poll*) skb->data; + struct pgm_poll6* poll6 = (struct pgm_poll6*)skb->data; + uint32_t poll_rand; + memcpy (&poll_rand, (AFI_IP6 == ntohs (poll4->poll_nla_afi)) ? poll6->poll6_rand : poll4->poll_rand, sizeof(poll_rand)); ++ { + const uint32_t poll_mask = (AFI_IP6 == ntohs (poll4->poll_nla_afi)) ? ntohl (poll6->poll6_mask) : ntohl (poll4->poll_mask); + + /* Check for probability match */ +@@ -2199,6 +2341,7 @@ + /* scoped per path nla + * TODO: manage list of pollers per peer + */ ++ { + const uint32_t poll_sqn = ntohl (poll4->poll_sqn); + const uint16_t poll_round = ntohs (poll4->poll_round); + +@@ -2213,6 +2356,7 @@ + source->last_poll_sqn = poll_sqn; + source->last_poll_round = poll_round; + ++ { + const uint16_t poll_s_type = ntohs (poll4->poll_s_type); + + /* Check poll type */ +@@ -2229,6 +2373,10 @@ + } + + return FALSE; ++ } ++ } ++ } ++ } + } + + /* Used to count PGM children */ diff --git a/3rdparty/openpgm-svn-r1135/pgm/receiver.c.rej b/3rdparty/openpgm-svn-r1135/pgm/receiver.c.rej new file mode 100644 index 0000000..bb4bac3 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/receiver.c.rej @@ -0,0 +1,37 @@ +*************** +*** 71,77 **** + pgm_assert (NULL != window); + pgm_assert (NULL != window->ack_backoff_queue.tail); + +- const struct pgm_peer_t* peer = (const struct pgm_peer_t*)window->ack_backoff_queue.tail; + pgm_assert (peer->sock->use_pgmcc); + return peer->ack_rb_expiry; + } +--- 71,79 ---- + pgm_assert (NULL != window); + pgm_assert (NULL != window->ack_backoff_queue.tail); + ++ const struct pgm_peer_t* peer = (const struct pgm_peer_t*)window->ack_backoff_queue.tail->data; ++ pgm_assert (NULL != peer); ++ + pgm_assert (peer->sock->use_pgmcc); + return peer->ack_rb_expiry; + } +*************** +*** 416,421 **** + sock->ack_c_p); + peer->spmr_expiry = now + sock->spmr_expiry; + + /* add peer to hash table and linked list */ + pgm_rwlock_writer_lock (&sock->peers_lock); + pgm_peer_t* entry = _pgm_peer_ref (peer); +--- 418,426 ---- + sock->ack_c_p); + peer->spmr_expiry = now + sock->spmr_expiry; + ++ /* Prepare ack_link */ ++ peer->ack_link.data = peer; ++ + /* add peer to hash table and linked list */ + pgm_rwlock_writer_lock (&sock->peers_lock); + pgm_peer_t* entry = _pgm_peer_ref (peer); diff --git a/3rdparty/openpgm-svn-r1085/pgm/receiver_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/receiver_unittest.c index 5221a0b..959afe3 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/receiver_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/receiver_unittest.c @@ -52,7 +52,7 @@ #define pgm_verify_nak mock_pgm_verify_nak #define pgm_verify_ncf mock_pgm_verify_ncf #define pgm_verify_poll mock_pgm_verify_poll -#define pgm_sendto mock_pgm_sendto +#define pgm_sendto_hops mock_pgm_sendto_hops #define pgm_time_now mock_pgm_time_now #define pgm_time_update_now mock_pgm_time_update_now #define pgm_rxw_destroy mock_pgm_rxw_destroy @@ -68,6 +68,7 @@ #define pgm_csum_fold mock_pgm_csum_fold #define pgm_compat_csum_partial mock_pgm_compat_csum_partial #define pgm_histogram_init mock_pgm_histogram_init +#define pgm_setsockopt mock_pgm_setsockopt #define RECEIVER_DEBUG @@ -146,10 +147,11 @@ mock_pgm_on_spmr ( /** net module */ PGM_GNUC_INTERNAL ssize_t -mock_pgm_sendto ( - pgm_sock_t* sock, +mock_pgm_sendto_hops ( + pgm_sock_t* sock, bool use_rate_limit, bool use_router_alert, + int hops, const void* buf, size_t len, const struct sockaddr* to, @@ -348,6 +350,19 @@ pgm_pkt_offset ( return 0; } +bool +mock_pgm_setsockopt ( + pgm_sock_t* const sock, + const int level, + const int optname, + const void* optval, + const socklen_t optlen + ) +{ + if (NULL == sock) + return FALSE; + return TRUE; +} /* target: * void @@ -432,7 +447,8 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, - * const int optname = PGM_RXW_SQNS + * const int level = IPPROTO_PGM, + * const int optname = PGM_RXW_SQNS, * const void* optval, * const socklen_t optlen = sizeof(int) * ) @@ -441,21 +457,23 @@ END_TEST START_TEST (test_set_rxw_sqns_pass_001) { pgm_sock_t* sock = generate_sock (); + const int level = IPPROTO_PGM; const int optname = PGM_RXW_SQNS; const int rxw_sqns = 100; const void* optval = &rxw_sqns; const socklen_t optlen = sizeof(int); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_rxw_sqns failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_rxw_sqns failed"); } END_TEST START_TEST (test_set_rxw_sqns_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_RXW_SQNS; const int rxw_sqns = 100; const void* optval = &rxw_sqns; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_rxw_sqns failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_rxw_sqns failed"); } END_TEST @@ -463,6 +481,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_RXW_SECS, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -472,21 +491,23 @@ END_TEST START_TEST (test_set_rxw_secs_pass_001) { pgm_sock_t* sock = generate_sock (); + const int level = IPPROTO_PGM; const int optname = PGM_RXW_SECS; const int rxw_secs = 10; const void* optval = &rxw_secs; const socklen_t optlen = sizeof(int); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_rxw_secs failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_rxw_secs failed"); } END_TEST START_TEST (test_set_rxw_secs_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_RXW_SECS; const int rxw_secs = 10; const void* optval = &rxw_secs; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_rxw_secs failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_rxw_secs failed"); } END_TEST @@ -494,6 +515,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_RXW_MAX_RTE, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -503,21 +525,23 @@ END_TEST START_TEST (test_set_rxw_max_rte_pass_001) { pgm_sock_t* sock = generate_sock (); + const int level = IPPROTO_PGM; const int optname = PGM_RXW_MAX_RTE; const int rxw_max_rte = 100*1000; const void* optval = &rxw_max_rte; const socklen_t optlen = sizeof(int); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_rxw_max_rte failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_rxw_max_rte failed"); } END_TEST START_TEST (test_set_rxw_max_rte_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_RXW_MAX_RTE; const int rxw_max_rte = 100*1000; const void* optval = &rxw_max_rte; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_rxw_max_rte failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_rxw_max_rte failed"); } END_TEST @@ -525,6 +549,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_PEER_EXPIRY, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -534,6 +559,7 @@ END_TEST START_TEST (test_set_peer_expiry_pass_001) { pgm_sock_t* sock = generate_sock (); + const int level = IPPROTO_PGM; const int optname = PGM_PEER_EXPIRY; const int peer_expiry = pgm_secs(100); const void* optval = &peer_expiry; @@ -541,17 +567,18 @@ START_TEST (test_set_peer_expiry_pass_001) /* pre-checking should verify value to spm ambient interval sock->spm_ambient_interval = pgm_secs(30); */ - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_peer_expiry failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_peer_expiry failed"); } END_TEST START_TEST (test_set_peer_expiry_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_PEER_EXPIRY; const int peer_expiry = pgm_secs(100); const void* optval = &peer_expiry; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_peer_expiry failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_peer_expiry failed"); } END_TEST @@ -559,6 +586,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_SPMR_EXPIRY, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -568,6 +596,7 @@ END_TEST START_TEST (test_set_spmr_expiry_pass_001) { pgm_sock_t* sock = generate_sock (); + const int level = IPPROTO_PGM; const int optname = PGM_SPMR_EXPIRY; const int spmr_expiry = pgm_secs(10); const void* optval = &spmr_expiry; @@ -575,17 +604,18 @@ START_TEST (test_set_spmr_expiry_pass_001) /* pre-checking should verify value to spm ambient interval sock->spm_ambient_interval = pgm_secs(30); */ - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_spmr_expiry failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_spmr_expiry failed"); } END_TEST START_TEST (test_set_spmr_expiry_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_SPMR_EXPIRY; const int spmr_expiry = pgm_secs(10); const void* optval = &spmr_expiry; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_spmr_expiry failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_spmr_expiry failed"); } END_TEST @@ -593,6 +623,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_NAK_BO_IVL, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -601,22 +632,24 @@ END_TEST START_TEST (test_set_nak_bo_ivl_pass_001) { + const int level = IPPROTO_PGM; pgm_sock_t* sock = generate_sock (); const int optname = PGM_NAK_BO_IVL; const int nak_bo_ivl = pgm_msecs(1000); const void* optval = &nak_bo_ivl; const socklen_t optlen = sizeof(int); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_nak_bo_ivl failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_nak_bo_ivl failed"); } END_TEST START_TEST (test_set_nak_bo_ivl_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_NAK_BO_IVL; const int nak_bo_ivl = pgm_msecs(1000); const void* optval = &nak_bo_ivl; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_nak_bo_ivl failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_nak_bo_ivl failed"); } END_TEST @@ -624,6 +657,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_NAK_RPT_IVL, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -633,21 +667,23 @@ END_TEST START_TEST (test_set_nak_rpt_ivl_pass_001) { pgm_sock_t* sock = generate_sock (); + const int level = IPPROTO_PGM; const int optname = PGM_NAK_RPT_IVL; const int nak_rpt_ivl = pgm_msecs(1000); const void* optval = &nak_rpt_ivl; const socklen_t optlen = sizeof(int); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_nak_rpt_ivl failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_nak_rpt_ivl failed"); } END_TEST START_TEST (test_set_nak_rpt_ivl_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_NAK_RPT_IVL; const int nak_rpt_ivl = pgm_msecs(1000); const void* optval = &nak_rpt_ivl; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_nak_rpt_ivl failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_nak_rpt_ivl failed"); } END_TEST @@ -655,6 +691,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_NAK_RDATA_IVL, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -664,21 +701,23 @@ END_TEST START_TEST (test_set_nak_rdata_ivl_pass_001) { pgm_sock_t* sock = generate_sock (); + const int level = IPPROTO_PGM; const int optname = PGM_NAK_RDATA_IVL; const int nak_rdata_ivl = pgm_msecs(1000); const void* optval = &nak_rdata_ivl; const socklen_t optlen = sizeof(int); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_nak_rdata_ivl failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_nak_rdata_ivl failed"); } END_TEST START_TEST (test_set_nak_rdata_ivl_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_NAK_RDATA_IVL; const int nak_rdata_ivl = pgm_msecs(1000); const void* optval = &nak_rdata_ivl; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_nak_rdata_ivl failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_nak_rdata_ivl failed"); } END_TEST @@ -686,6 +725,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_NAK_DATA_RETRIES, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -695,21 +735,23 @@ END_TEST START_TEST (test_set_nak_data_retries_pass_001) { pgm_sock_t* sock = generate_sock (); + const int level = IPPROTO_PGM; const int optname = PGM_NAK_DATA_RETRIES; const int retries = 1000; const void* optval = &retries; const socklen_t optlen = sizeof(int); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_nak_data_retries failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_nak_data_retries failed"); } END_TEST START_TEST (test_set_nak_data_retries_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_NAK_DATA_RETRIES; const int retries = 1000; const void* optval = &retries; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_nak_data_retries failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_nak_data_retries failed"); } END_TEST @@ -717,6 +759,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_NAK_NCF_RETRIES, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -726,21 +769,23 @@ END_TEST START_TEST (test_set_nak_ncf_retries_pass_001) { pgm_sock_t* sock = generate_sock (); + const int level = IPPROTO_PGM; const int optname = PGM_NAK_NCF_RETRIES; const int retries = 1000; const void* optval = &retries; const socklen_t optlen = sizeof(int); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_ncf_data_retries failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_ncf_data_retries failed"); } END_TEST START_TEST (test_set_nak_ncf_retries_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_NAK_NCF_RETRIES; const int retries = 1000; const void* optval = &retries; const socklen_t optlen = sizeof(int); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_ncf_data_retries failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_ncf_data_retries failed"); } END_TEST diff --git a/3rdparty/openpgm-svn-r1085/pgm/recv.c b/3rdparty/openpgm-svn-r1135/pgm/recv.c index 63cbce5..595beec 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/recv.c +++ b/3rdparty/openpgm-svn-r1135/pgm/recv.c @@ -19,7 +19,10 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + #include <errno.h> #ifndef _WIN32 # include <sys/types.h> @@ -546,7 +549,7 @@ on_pgm ( else if (PGM_IS_PEER (skb->pgm_header->pgm_type)) return on_peer (sock, skb, source); - pgm_trace (PGM_LOG_ROLE_NETWORK,_("Discarded unknown PGM packet.")); + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Discarded PGM packet.")); if (sock->can_send_data) sock->cumulative_stats[PGM_PC_SOURCE_PACKETS_DISCARDED]++; return FALSE; diff --git a/3rdparty/openpgm-svn-r1135/pgm/recv.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/recv.c.c89.patch new file mode 100644 index 0000000..171c74c --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/recv.c.c89.patch @@ -0,0 +1,404 @@ +--- recv.c 2010-08-04 16:33:15.000000000 +0800 ++++ recv.c89 2010-08-05 11:37:10.000000000 +0800 +@@ -45,12 +45,11 @@ + + #ifdef _WIN32 + # define cmsghdr wsacmsghdr +-# define CMSG_FIRSTHDR(msg) WSA_CMSG_FIRSTHDR(msg) +-# define CMSG_NXTHDR(msg, cmsg) WSA_CMSG_NXTHDR(msg, cmsg) +-# define CMSG_DATA(cmsg) WSA_CMSG_DATA(cmsg) +-# define CMSG_SPACE(len) WSA_CMSG_SPACE(len) +-# define CMSG_LEN(len) WSA_CMSG_LEN(len) +-# endif ++# define PGM_CMSG_FIRSTHDR(msg) WSA_CMSG_FIRSTHDR(msg) ++# define PGM_CMSG_NXTHDR(msg, cmsg) WSA_CMSG_NXTHDR(msg, cmsg) ++# define PGM_CMSG_DATA(cmsg) WSA_CMSG_DATA(cmsg) ++# define PGM_CMSG_SPACE(len) WSA_CMSG_SPACE(len) ++# define PGM_CMSG_LEN(len) WSA_CMSG_LEN(len) + #endif + + +@@ -91,11 +90,11 @@ + if (len <= 0) + return len; + #else +- struct pgm_iovec iov = { +- .iov_base = skb->head, +- .iov_len = sock->max_tpdu +- }; ++ { ++ struct pgm_iovec iov; + char aux[ 1024 ]; ++ iov.iov_base = skb->head; ++ iov.iov_len = sock->max_tpdu; + # ifndef _WIN32 + struct msghdr msg = { + .msg_name = src_addr, +@@ -111,15 +110,16 @@ + if (len <= 0) + return len; + # else /* !_WIN32 */ +- WSAMSG msg = { +- .name = (LPSOCKADDR)src_addr, +- .namelen = src_addrlen, +- .lpBuffers = (LPWSABUF)&iov, +- .dwBufferCount = 1, +- .dwFlags = 0 +- }; ++ { ++ WSAMSG msg; ++ msg.name = (LPSOCKADDR)src_addr; ++ msg.namelen = src_addrlen; ++ msg.lpBuffers = (LPWSABUF)&iov; ++ msg.dwBufferCount = 1; ++ msg.dwFlags = 0; + msg.Control.buf = aux; + msg.Control.len = sizeof(aux); ++ { + DWORD len; + if (SOCKET_ERROR == pgm_WSARecvMsg (sock->recv_sock, &msg, &len, NULL, NULL)) { + return -1; +@@ -145,7 +145,7 @@ + skb->sock = sock; + skb->tstamp = pgm_time_update_now(); + skb->data = skb->head; +- skb->len = len; ++ skb->len = (uint16_t)len; + skb->zero_padded = 0; + skb->tail = (char*)skb->data + len; + +@@ -161,9 +161,9 @@ + #else + struct cmsghdr* cmsg; + #endif +- for (cmsg = CMSG_FIRSTHDR(&msg); ++ for (cmsg = PGM_CMSG_FIRSTHDR(&msg); + cmsg != NULL; +- cmsg = CMSG_NXTHDR(&msg, cmsg)) ++ cmsg = PGM_CMSG_NXTHDR(&msg, cmsg)) + { + /* both IP_PKTINFO and IP_RECVDSTADDR exist on OpenSolaris, so capture + * each type if defined. +@@ -172,12 +172,13 @@ + if (IPPROTO_IP == cmsg->cmsg_level && + IP_PKTINFO == cmsg->cmsg_type) + { +- const void* pktinfo = CMSG_DATA(cmsg); ++ const void* pktinfo = PGM_CMSG_DATA(cmsg); + /* discard on invalid address */ + if (PGM_UNLIKELY(NULL == pktinfo)) { + pgm_debug ("in_pktinfo is NULL"); + return -1; + } ++ { + const struct in_pktinfo* in = pktinfo; + struct sockaddr_in s4; + memset (&s4, 0, sizeof(s4)); +@@ -185,18 +186,20 @@ + s4.sin_addr.s_addr = in->ipi_addr.s_addr; + memcpy (dst_addr, &s4, sizeof(s4)); + break; ++ } + } + #endif + #ifdef IP_RECVDSTADDR + if (IPPROTO_IP == cmsg->cmsg_level && + IP_RECVDSTADDR == cmsg->cmsg_type) + { +- const void* recvdstaddr = CMSG_DATA(cmsg); ++ const void* recvdstaddr = PGM_CMSG_DATA(cmsg); + /* discard on invalid address */ + if (PGM_UNLIKELY(NULL == recvdstaddr)) { + pgm_debug ("in_recvdstaddr is NULL"); + return -1; + } ++ { + const struct in_addr* in = recvdstaddr; + struct sockaddr_in s4; + memset (&s4, 0, sizeof(s4)); +@@ -204,6 +207,7 @@ + s4.sin_addr.s_addr = in->s_addr; + memcpy (dst_addr, &s4, sizeof(s4)); + break; ++ } + } + #endif + #if !defined(IP_PKTINFO) && !defined(IP_RECVDSTADDR) +@@ -213,12 +217,13 @@ + if (IPPROTO_IPV6 == cmsg->cmsg_level && + IPV6_PKTINFO == cmsg->cmsg_type) + { +- const void* pktinfo = CMSG_DATA(cmsg); ++ const void* pktinfo = PGM_CMSG_DATA(cmsg); + /* discard on invalid address */ + if (PGM_UNLIKELY(NULL == pktinfo)) { + pgm_debug ("in6_pktinfo is NULL"); + return -1; + } ++ { + const struct in6_pktinfo* in6 = pktinfo; + struct sockaddr_in6 s6; + memset (&s6, 0, sizeof(s6)); +@@ -228,11 +233,15 @@ + memcpy (dst_addr, &s6, sizeof(s6)); + /* does not set flow id */ + break; ++ } + } + } + } + #endif + return len; ++ } ++ } ++ } + } + + /* upstream = receiver to source, peer-to-peer = receive to receiver +@@ -349,6 +358,7 @@ + } + + /* check to see the source this peer-to-peer message is about is in our peer list */ ++ { + pgm_tsi_t upstream_tsi; + memcpy (&upstream_tsi.gsi, &skb->tsi.gsi, sizeof(pgm_gsi_t)); + upstream_tsi.sport = skb->pgm_header->pgm_dport; +@@ -391,6 +401,7 @@ + else if (sock->can_send_data) + sock->cumulative_stats[PGM_PC_SOURCE_PACKETS_DISCARDED]++; + return FALSE; ++ } + } + + /* source to receiver message +@@ -416,11 +427,13 @@ + pgm_assert (NULL != source); + + #ifdef RECV_DEBUG ++ { + char saddr[INET6_ADDRSTRLEN], daddr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop (src_addr, saddr, sizeof(saddr)); + pgm_sockaddr_ntop (dst_addr, daddr, sizeof(daddr)); + pgm_debug ("on_downstream (sock:%p skb:%p src-addr:%s dst-addr:%s source:%p)", + (const void*)sock, (const void*)skb, saddr, daddr, (const void*)source); ++ } + #endif + + if (PGM_UNLIKELY(!sock->can_recv_data)) { +@@ -527,11 +540,13 @@ + pgm_assert (NULL != source); + + #ifdef RECV_DEBUG ++ { + char saddr[INET6_ADDRSTRLEN], daddr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop (src_addr, saddr, sizeof(saddr)); + pgm_sockaddr_ntop (dst_addr, daddr, sizeof(daddr)); + pgm_debug ("on_pgm (sock:%p skb:%p src-addr:%s dst-addr:%s source:%p)", + (const void*)sock, (const void*)skb, saddr, daddr, (const void*)source); ++ } + #endif + + if (PGM_IS_DOWNSTREAM (skb->pgm_header->pgm_type)) +@@ -585,8 +600,10 @@ + const int status = pgm_poll_info (sock, fds, &n_fds, POLLIN); + pgm_assert (-1 != status); + #else ++ { + fd_set readfds; + FD_ZERO(&readfds); ++ { + const int status = pgm_select_info (sock, &readfds, NULL, &n_fds); + pgm_assert (-1 != status); + #endif /* CONFIG_HAVE_POLL */ +@@ -597,19 +614,21 @@ + sock->is_pending_read = FALSE; + } + ++ { + int timeout; + if (sock->can_send_data && !pgm_txw_retransmit_is_empty (sock->window)) + timeout = 0; + else +- timeout = pgm_timer_expiration (sock); ++ timeout = (int)pgm_timer_expiration (sock); + + #ifdef CONFIG_HAVE_POLL + const int ready = poll (fds, n_fds, timeout /* μs */ / 1000 /* to ms */); + #else +- struct timeval tv_timeout = { +- .tv_sec = timeout > 1000000L ? timeout / 1000000UL : 0, +- .tv_usec = timeout > 1000000L ? timeout % 1000000UL : timeout +- }; ++ { ++ struct timeval tv_timeout; ++ tv_timeout.tv_sec = timeout > 1000000L ? timeout / 1000000UL : 0; ++ tv_timeout.tv_usec = timeout > 1000000L ? timeout % 1000000UL : timeout; ++ { + const int ready = select (n_fds, &readfds, NULL, NULL, &tv_timeout); + #endif + if (PGM_UNLIKELY(-1 == ready)) { +@@ -619,6 +638,11 @@ + pgm_debug ("recv again on empty"); + return EAGAIN; + } ++ } ++ } ++ } ++ } ++ } + } while (pgm_timer_check (sock)); + pgm_debug ("state generated event"); + return EINTR; +@@ -653,7 +677,7 @@ + { + int status = PGM_IO_STATUS_WOULD_BLOCK; + +- pgm_debug ("pgm_recvmsgv (sock:%p msg-start:%p msg-len:%zu flags:%d bytes-read:%p error:%p)", ++ pgm_debug ("pgm_recvmsgv (sock:%p msg-start:%p msg-len:%lu flags:%d bytes-read:%p error:%p)", + (void*)sock, (void*)msg_start, msg_len, flags, (void*)_bytes_read, (void*)error); + + /* parameters */ +@@ -676,7 +700,7 @@ + pgm_assert (sock->max_tpdu > 0); + if (sock->can_recv_data) { + pgm_assert (NULL != sock->peers_hashtable); +- pgm_assert_cmpuint (sock->nak_bo_ivl, >, 1); ++ pgm_assert_cmpuint ((unsigned int)sock->nak_bo_ivl, >, 1); + pgm_assert (pgm_notify_is_valid (&sock->pending_notify)); + } + +@@ -686,6 +710,7 @@ + if (PGM_UNLIKELY(sock->is_reset)) { + pgm_assert (NULL != sock->peers_pending); + pgm_assert (NULL != sock->peers_pending->data); ++ { + pgm_peer_t* peer = sock->peers_pending->data; + if (flags & MSG_ERRQUEUE) + pgm_set_reset_error (sock, peer, msg_start); +@@ -703,6 +728,7 @@ + pgm_mutex_unlock (&sock->receiver_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_RESET; ++ } + } + + /* timer status */ +@@ -724,6 +750,7 @@ + pgm_notify_clear (&sock->rdata_notify); + } + ++ { + size_t bytes_read = 0; + unsigned data_read = 0; + struct pgm_msgv_t* pmsg = msg_start; +@@ -743,6 +770,7 @@ + * + * We cannot actually block here as packets pushed by the timers need to be addressed too. + */ ++ { + struct sockaddr_storage src, dst; + ssize_t len; + size_t bytes_received = 0; +@@ -770,6 +798,7 @@ + _("Transport socket error: %s"), + strerror (save_errno)); + #else ++ { + const int save_wsa_errno = WSAGetLastError (); + if (PGM_LIKELY(WSAEWOULDBLOCK == save_wsa_errno)) { + goto check_for_repeat; +@@ -780,6 +809,7 @@ + pgm_error_from_wsa_errno (save_wsa_errno), + _("Transport socket error: %s"), + pgm_wsastrerror (save_wsa_errno)); ++ } + #endif /* !_WIN32 */ + goto out; + } +@@ -794,6 +824,7 @@ + bytes_received += len; + } + ++ { + pgm_error_t* err = NULL; + const bool is_valid = (sock->udp_encap_ucast_port || AF_INET6 == src.ss_family) ? + pgm_parse_udp_encap (sock->rx_buffer, &err) : +@@ -813,6 +844,7 @@ + goto recv_again; + } + ++ { + pgm_peer_t* source = NULL; + if (PGM_UNLIKELY(!on_pgm (sock, sock->rx_buffer, (struct sockaddr*)&src, (struct sockaddr*)&dst, &source))) + goto recv_again; +@@ -893,6 +925,7 @@ + if (PGM_UNLIKELY(sock->is_reset)) { + pgm_assert (NULL != sock->peers_pending); + pgm_assert (NULL != sock->peers_pending->data); ++ { + pgm_peer_t* peer = sock->peers_pending->data; + if (flags & MSG_ERRQUEUE) + pgm_set_reset_error (sock, peer, msg_start); +@@ -910,6 +943,7 @@ + pgm_mutex_unlock (&sock->receiver_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_RESET; ++ } + } + pgm_mutex_unlock (&sock->receiver_mutex); + pgm_rwlock_reader_unlock (&sock->lock); +@@ -944,6 +978,10 @@ + pgm_mutex_unlock (&sock->receiver_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_NORMAL; ++ } ++ } ++ } ++ } + } + + /* read one contiguous apdu and return as a IO scatter/gather array. msgv is owned by +@@ -999,13 +1037,15 @@ + pgm_return_val_if_fail (sizeof (struct pgm_sockaddr_t) == *fromlen, PGM_IO_STATUS_ERROR); + } + +- pgm_debug ("pgm_recvfrom (sock:%p buf:%p buflen:%zu flags:%d bytes-read:%p from:%p from:%p error:%p)", ++ pgm_debug ("pgm_recvfrom (sock:%p buf:%p buflen:%lu flags:%d bytes-read:%p from:%p from:%p error:%p)", + (const void*)sock, buf, buflen, flags, (const void*)_bytes_read, (const void*)from, (const void*)fromlen, (const void*)error); + ++ { + const int status = pgm_recvmsg (sock, &msgv, flags & ~(MSG_ERRQUEUE), &bytes_read, error); + if (PGM_IO_STATUS_NORMAL != status) + return status; + ++ { + size_t bytes_copied = 0; + struct pgm_sk_buff_t** skb = msgv.msgv_skb; + struct pgm_sk_buff_t* pskb = *skb; +@@ -1019,7 +1059,7 @@ + while (bytes_copied < bytes_read) { + size_t copy_len = pskb->len; + if (bytes_copied + copy_len > buflen) { +- pgm_warn (_("APDU truncated, original length %zu bytes."), ++ pgm_warn (_("APDU truncated, original length %lu bytes."), + bytes_read); + copy_len = buflen - bytes_copied; + bytes_read = buflen; +@@ -1031,6 +1071,8 @@ + if (_bytes_read) + *_bytes_read = bytes_copied; + return PGM_IO_STATUS_NORMAL; ++ } ++ } + } + + /* Basic recv operation, copying data from window to application. +@@ -1051,7 +1093,7 @@ + pgm_return_val_if_fail (NULL != sock, PGM_IO_STATUS_ERROR); + if (PGM_LIKELY(buflen)) pgm_return_val_if_fail (NULL != buf, PGM_IO_STATUS_ERROR); + +- pgm_debug ("pgm_recv (sock:%p buf:%p buflen:%zu flags:%d bytes-read:%p error:%p)", ++ pgm_debug ("pgm_recv (sock:%p buf:%p buflen:%lu flags:%d bytes-read:%p error:%p)", + (const void*)sock, buf, buflen, flags, (const void*)bytes_read, (const void*)error); + + return pgm_recvfrom (sock, buf, buflen, flags, bytes_read, NULL, NULL, error); diff --git a/3rdparty/openpgm-svn-r1085/pgm/recv_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/recv_unittest.c index 2719897..2719897 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/recv_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/recv_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/reed_solomon.c b/3rdparty/openpgm-svn-r1135/pgm/reed_solomon.c index a9a292c..a9a292c 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/reed_solomon.c +++ b/3rdparty/openpgm-svn-r1135/pgm/reed_solomon.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/reed_solomon.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/reed_solomon.c.c89.patch new file mode 100644 index 0000000..93b2ee2 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/reed_solomon.c.c89.patch @@ -0,0 +1,467 @@ +--- reed_solomon.c 2010-05-21 11:35:32.000000000 +0800 ++++ reed_solomon.c89 2010-08-04 16:46:52.000000000 +0800 +@@ -48,6 +48,7 @@ + return; + + #ifdef CONFIG_GALOIS_MUL_LUT ++ { + const pgm_gf8_t* gfmul_b = &pgm_gftable[ (uint16_t)b << 8 ]; + #endif + +@@ -90,6 +91,10 @@ + #endif + i++; + } ++ ++#ifdef CONFIG_GALOIS_MUL_LUT ++ } ++#endif + } + + /* Basic matrix multiplication. +@@ -111,19 +116,28 @@ + const uint16_t p + ) + { +- for (uint_fast16_t j = 0; j < m; j++) + { +- for (uint_fast16_t i = 0; i < p; i++) ++ uint_fast16_t j; ++ for (j = 0; j < m; j++) ++ { ++ { ++ uint_fast16_t i; ++ for (i = 0; i < p; i++) + { + pgm_gf8_t sum = 0; + +- for (uint_fast16_t k = 0; k < n; k++) ++ { ++ uint_fast16_t k; ++ for (k = 0; k < n; k++) + { + sum ^= pgm_gfmul ( a[ (j * n) + k ], b[ (k * p) + i ] ); + } ++ } + + c[ (j * p) + i ] = sum; + } ++ } ++ } + } + } + +@@ -144,15 +158,16 @@ + const uint8_t n + ) + { +- uint8_t pivot_rows[ n ]; +- uint8_t pivot_cols[ n ]; +- bool pivots[ n ]; ++ uint8_t* pivot_rows = pgm_newa (uint8_t, n); ++ uint8_t* pivot_cols = pgm_newa (uint8_t, n); ++ bool* pivots = pgm_newa (bool, n); ++ pgm_gf8_t* identity = pgm_newa (pgm_gf8_t, n); + memset (pivots, 0, sizeof(pivots)); +- +- pgm_gf8_t identity[ n ]; + memset (identity, 0, sizeof(identity)); + +- for (uint_fast8_t i = 0; i < n; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < n; i++) + { + uint_fast8_t row = 0, col = 0; + +@@ -163,11 +178,15 @@ + } + else + { +- for (uint_fast8_t j = 0; j < n; j++) ++ { ++ uint_fast8_t j; ++ for (j = 0; j < n; j++) + { + if (pivots[ j ]) continue; + +- for (uint_fast8_t x = 0; x < n; x++) ++ { ++ uint_fast8_t x; ++ for (x = 0; x < n; x++) + { + if (!pivots[ x ] && M[ (j * n) + x ]) + { +@@ -176,6 +195,8 @@ + goto found; + } + } ++ } ++ } + } + } + +@@ -185,12 +206,15 @@ + /* pivot */ + if (row != col) + { +- for (uint_fast8_t x = 0; x < n; x++) ++ { ++ uint_fast8_t x; ++ for (x = 0; x < n; x++) + { + pgm_gf8_t *pivot_row = &M[ (row * n) + x ], + *pivot_col = &M[ (col * n) + x ]; + SWAP( *pivot_row, *pivot_col ); + } ++ } + } + + /* save location */ +@@ -203,44 +227,59 @@ + const pgm_gf8_t c = M[ (col * n) + col ]; + M[ (col * n) + col ] = 1; + +- for (uint_fast8_t x = 0; x < n; x++) ++ { ++ uint_fast8_t x; ++ for (x = 0; x < n; x++) + { + M[ (col * n) + x ] = pgm_gfdiv( M[ (col * n) + x ], c ); + } ++ } + } + + /* reduce if not an identity row */ + identity[ col ] = 1; + if (memcmp (&M[ (col * n) ], identity, n * sizeof(pgm_gf8_t))) + { +- for ( uint_fast8_t x = 0; ++ { ++ uint_fast8_t x; ++ for ( x = 0; + x < n; + x++ ) + { + if (x == col) continue; + ++ { + const pgm_gf8_t c = M[ (x * n) + col ]; + M[ (x * n) + col ] = 0; + + _pgm_gf_vec_addmul (&M[ x * n ], c, &M[ col * n ], n); ++ } ++ } + } + } + identity[ col ] = 0; + } ++ } + + /* revert all pivots */ +- for (int_fast16_t i = n - 1; i >= 0; i--) ++ { ++ int_fast16_t i; ++ for (i = n - 1; i >= 0; i--) + { + if (pivot_rows[ i ] != pivot_cols[ i ]) + { +- for (uint_fast8_t j = 0; j < n; j++) ++ { ++ uint_fast8_t j; ++ for (j = 0; j < n; j++) + { + pgm_gf8_t *pivot_row = &M[ (j * n) + pivot_rows[ i ] ], + *pivot_col = &M[ (j * n) + pivot_cols[ i ] ]; + SWAP( *pivot_row, *pivot_col ); + } ++ } + } + } ++ } + } + + /* Gauss–Jordan elimination optimised for Vandermonde matrices +@@ -277,49 +316,73 @@ + * 1: Work out coefficients. + */ + +- pgm_gf8_t P[ n ]; ++ { ++ pgm_gf8_t* P = pgm_newa (pgm_gf8_t, n); + memset (P, 0, sizeof(P)); + + /* copy across second row, i.e. j = 2 */ +- for (uint_fast8_t i = 0; i < n; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < n; i++) + { + P[ i ] = V[ (i * n) + 1 ]; + } ++ } + +- pgm_gf8_t alpha[ n ]; ++ { ++ pgm_gf8_t* alpha = pgm_newa (pgm_gf8_t, n); + memset (alpha, 0, sizeof(alpha)); + + alpha[ n - 1 ] = P[ 0 ]; +- for (uint_fast8_t i = 1; i < n; i++) + { +- for (uint_fast8_t j = (n - i); j < (n - 1); j++) ++ uint_fast8_t i; ++ for (i = 1; i < n; i++) ++ { ++ { ++ uint_fast8_t j; ++ for (j = (n - i); j < (n - 1); j++) + { + alpha[ j ] ^= pgm_gfmul( P[ i ], alpha[ j + 1 ] ); + } ++ } + alpha[ n - 1 ] ^= P[ i ]; + } ++ } + + /* 2: Obtain numberators and denominators by synthetic division. + */ + +- pgm_gf8_t b[ n ]; ++ { ++ pgm_gf8_t* b = pgm_newa (pgm_gf8_t, n); + b[ n - 1 ] = 1; +- for (uint_fast8_t j = 0; j < n; j++) ++ { ++ uint_fast8_t j; ++ for (j = 0; j < n; j++) + { + const pgm_gf8_t xx = P[ j ]; + pgm_gf8_t t = 1; + + /* skip first iteration */ +- for (int_fast16_t i = n - 2; i >= 0; i--) ++ { ++ int_fast16_t i; ++ for (i = n - 2; i >= 0; i--) + { + b[ i ] = alpha[ i + 1 ] ^ pgm_gfmul( xx, b[ i + 1 ] ); + t = pgm_gfmul( xx, t ) ^ b[ i ]; + } ++ } + +- for (uint_fast8_t i = 0; i < n; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < n; i++) + { + V[ (i * n) + j ] = pgm_gfdiv ( b[ i ], t ); + } ++ } ++ } ++ } ++ } ++ } + } + } + +@@ -358,23 +421,31 @@ + * + * Be careful, Harry! + */ ++ { + #ifdef CONFIG_PREFER_MALLOC + pgm_gf8_t* V = pgm_new0 (pgm_gf8_t, n * k); + #else + pgm_gf8_t* V = pgm_newa (pgm_gf8_t, n * k); + memset (V, 0, n * k); + #endif ++ { + pgm_gf8_t* p = V + k; + V[0] = 1; +- for (uint_fast8_t j = 0; j < (n - 1); j++) + { +- for (uint_fast8_t i = 0; i < k; i++) ++ uint_fast8_t j; ++ for (j = 0; j < (n - 1); j++) ++ { ++ { ++ uint_fast8_t i; ++ for (i = 0; i < k; i++) + { + /* the {i, j} entry of V_{k,n} is v_{i,j} = α^^(i×j), + * where 0 <= i <= k - 1 and 0 <= j <= n - 1. + */ + *p++ = pgm_gfantilog[ ( i * j ) % PGM_GF_MAX ]; + } ++ } ++ } + } + + /* This generator matrix would create a Maximum Distance Separable (MDS) +@@ -385,6 +456,7 @@ + * + * 1: matrix V_{k,k} formed by the first k columns of V_{k,n} + */ ++ { + pgm_gf8_t* V_kk = V; + pgm_gf8_t* V_kn = V + (k * k); + +@@ -402,10 +474,16 @@ + + /* 4: set identity matrix for original data + */ +- for (uint_fast8_t i = 0; i < k; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < k; i++) + { + rs->GM[ (i * k) + i ] = 1; + } ++ } ++ } ++ } ++ } + } + + void +@@ -446,11 +524,14 @@ + pgm_assert (len > 0); + + memset (dst, 0, len); +- for (uint_fast8_t i = 0; i < rs->k; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < rs->k; i++) + { + const pgm_gf8_t c = rs->GM[ (offset * rs->k) + i ]; + _pgm_gf_vec_addmul (dst, c, src[i], len); + } ++ } + } + + /* original data block of packets with missing packet entries replaced +@@ -472,7 +553,9 @@ + + /* create new recovery matrix from generator + */ +- for (uint_fast8_t i = 0; i < rs->k; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < rs->k; i++) + { + if (offsets[i] < rs->k) { + memset (&rs->RM[ i * rs->k ], 0, rs->k * sizeof(pgm_gf8_t)); +@@ -481,34 +564,46 @@ + } + memcpy (&rs->RM[ i * rs->k ], &rs->GM[ offsets[ i ] * rs->k ], rs->k * sizeof(pgm_gf8_t)); + } ++ } + + /* invert */ + _pgm_matinv (rs->RM, rs->k); + +- pgm_gf8_t* repairs[ rs->k ]; ++ { ++ pgm_gf8_t** repairs = pgm_newa (pgm_gf8_t*, rs->k); + + /* multiply out, through the length of erasures[] */ +- for (uint_fast8_t j = 0; j < rs->k; j++) ++ { ++ uint_fast8_t j; ++ for (j = 0; j < rs->k; j++) + { + if (offsets[ j ] < rs->k) + continue; + ++ { + #ifdef CONFIG_PREFER_MALLOC + pgm_gf8_t* erasure = repairs[ j ] = pgm_malloc0 (len); + #else + pgm_gf8_t* erasure = repairs[ j ] = pgm_alloca (len); + memset (erasure, 0, len); + #endif +- for (uint_fast8_t i = 0; i < rs->k; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < rs->k; i++) + { + pgm_gf8_t* src = block[ i ]; + pgm_gf8_t c = rs->RM[ (j * rs->k) + i ]; + _pgm_gf_vec_addmul (erasure, c, src, len); + } ++ } ++ } ++ } + } + + /* move repaired over parity packets */ +- for (uint_fast8_t j = 0; j < rs->k; j++) ++ { ++ uint_fast8_t j; ++ for (j = 0; j < rs->k; j++) + { + if (offsets[ j ] < rs->k) + continue; +@@ -518,6 +613,8 @@ + pgm_free (repairs[ j ]); + #endif + } ++ } ++ } + } + + /* entire FEC block of original data and parity packets. +@@ -539,7 +636,9 @@ + + /* create new recovery matrix from generator + */ +- for (uint_fast8_t i = 0; i < rs->k; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < rs->k; i++) + { + if (offsets[i] < rs->k) { + memset (&rs->RM[ i * rs->k ], 0, rs->k * sizeof(pgm_gf8_t)); +@@ -548,28 +647,39 @@ + } + memcpy (&rs->RM[ i * rs->k ], &rs->GM[ offsets[ i ] * rs->k ], rs->k * sizeof(pgm_gf8_t)); + } ++ } + + /* invert */ + _pgm_matinv (rs->RM, rs->k); + + /* multiply out, through the length of erasures[] */ +- for (uint_fast8_t j = 0; j < rs->k; j++) ++ { ++ uint_fast8_t j; ++ for (j = 0; j < rs->k; j++) + { + if (offsets[ j ] < rs->k) + continue; + ++ { + uint_fast8_t p = rs->k; + pgm_gf8_t* erasure = block[ j ]; +- for (uint_fast8_t i = 0; i < rs->k; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < rs->k; i++) + { + pgm_gf8_t* src; + if (offsets[ i ] < rs->k) + src = block[ i ]; + else + src = block[ p++ ]; ++ { + const pgm_gf8_t c = rs->RM[ (j * rs->k) + i ]; + _pgm_gf_vec_addmul (erasure, c, src, len); ++ } ++ } + } ++ } ++ } + } + } + diff --git a/3rdparty/openpgm-svn-r1085/pgm/reed_solomon_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/reed_solomon_unittest.c index 5e0e75e..5e0e75e 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/reed_solomon_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/reed_solomon_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/rxw.c b/3rdparty/openpgm-svn-r1135/pgm/rxw.c index ce04ef5..a6891d9 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/rxw.c +++ b/3rdparty/openpgm-svn-r1135/pgm/rxw.c @@ -20,7 +20,11 @@ */ #define __STDC_FORMAT_MACROS -#include <inttypes.h> +#ifdef _MSC_VER +# include <pgm/wininttypes.h> +#else +# include <inttypes.h> +#endif #include <impl/i18n.h> #include <impl/framework.h> #include <impl/rxw.h> @@ -68,9 +72,9 @@ static inline bool _pgm_rxw_is_last_of_tg_sqn (pgm_rxw_t*const, const uint32_t); static int _pgm_rxw_insert (pgm_rxw_t*const restrict, struct pgm_sk_buff_t*const restrict); static int _pgm_rxw_append (pgm_rxw_t*const restrict, struct pgm_sk_buff_t*const restrict, const pgm_time_t); static int _pgm_rxw_add_placeholder_range (pgm_rxw_t*const, const uint32_t, const pgm_time_t, const pgm_time_t); -static void _pgm_rxw_unlink (pgm_rxw_t*const restrict, struct pgm_sk_buff_t*restrict); +static void _pgm_rxw_unlink (pgm_rxw_t*const restrict, struct pgm_sk_buff_t*const restrict); static uint32_t _pgm_rxw_remove_trail (pgm_rxw_t*const); -static void _pgm_rxw_state (pgm_rxw_t*restrict, struct pgm_sk_buff_t*restrict, const int); +static void _pgm_rxw_state (pgm_rxw_t*const restrict, struct pgm_sk_buff_t*const restrict, const int); static inline void _pgm_rxw_shuffle_parity (pgm_rxw_t*const restrict, struct pgm_sk_buff_t*const restrict); static inline ssize_t _pgm_rxw_incoming_read (pgm_rxw_t*const restrict, struct pgm_msgv_t**restrict, uint32_t); static bool _pgm_rxw_is_apdu_complete (pgm_rxw_t*const restrict, const uint32_t); @@ -171,7 +175,7 @@ _pgm_rxw_incoming_is_empty ( pgm_rxw_t* pgm_rxw_create ( - const pgm_tsi_t* tsi, + const pgm_tsi_t*const tsi, const uint16_t tpdu_size, const unsigned sqns, /* transmit window size in sequence numbers */ const unsigned secs, /* size in seconds */ diff --git a/3rdparty/openpgm-svn-r1135/pgm/rxw.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/rxw.c.c89.patch new file mode 100644 index 0000000..1eef6b2 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/rxw.c.c89.patch @@ -0,0 +1,565 @@ +--- rxw.c 2010-08-04 17:06:11.000000000 +0800 ++++ rxw.c89 2010-08-05 11:36:04.000000000 +0800 +@@ -198,11 +198,12 @@ + pgm_assert_cmpuint (max_rte, >, 0); + } + +- pgm_debug ("create (tsi:%s max-tpdu:%" PRIu16 " sqns:%" PRIu32 " secs %u max-rte %zd ack-c_p %" PRIu32 ")", ++ pgm_debug ("create (tsi:%s max-tpdu:%" PRIu16 " sqns:%" PRIu32 " secs %u max-rte %ld ack-c_p %" PRIu32 ")", + pgm_tsi_print (tsi), tpdu_size, sqns, secs, max_rte, ack_c_p); + + /* calculate receive window parameters */ + pgm_assert (sqns || (secs && max_rte)); ++ { + const unsigned alloc_sqns = sqns ? sqns : ( (secs * max_rte) / tpdu_size ); + window = pgm_malloc0 (sizeof(pgm_rxw_t) + ( alloc_sqns * sizeof(struct pgm_sk_buff_t*) )); + +@@ -238,6 +239,7 @@ + pgm_assert (!pgm_rxw_is_full (window)); + + return window; ++ } + } + + /* destructor for receive window. must not be called more than once for same window. +@@ -308,7 +310,7 @@ + /* pre-conditions */ + pgm_assert (NULL != window); + pgm_assert (NULL != skb); +- pgm_assert_cmpuint (nak_rb_expiry, >, 0); ++ pgm_assert_cmpuint ((unsigned int)nak_rb_expiry, >, 0); + pgm_assert_cmpuint (pgm_rxw_max_length (window), >, 0); + pgm_assert (pgm_skb_is_valid (skb)); + pgm_assert (((const pgm_list_t*)skb)->next == NULL); +@@ -371,6 +373,7 @@ + return _pgm_rxw_insert (window, skb); + } + ++ { + const struct pgm_sk_buff_t* const first_skb = _pgm_rxw_peek (window, _pgm_rxw_tg_sqn (window, skb->sequence)); + const pgm_rxw_state_t* const first_state = (pgm_rxw_state_t*)&first_skb->cb; + +@@ -385,6 +388,7 @@ + + pgm_assert (NULL != first_state); + status = _pgm_rxw_add_placeholder_range (window, _pgm_rxw_tg_sqn (window, skb->sequence), now, nak_rb_expiry); ++ } + } + else + { +@@ -468,7 +472,7 @@ + { + /* pre-conditions */ + pgm_assert (NULL != window); +- pgm_assert_cmpuint (nak_rb_expiry, >, 0); ++ pgm_assert_cmpuint ((unsigned int)nak_rb_expiry, >, 0); + + pgm_debug ("pgm_rxw_update (window:%p txw-lead:%" PRIu32 " txw-trail:%" PRIu32 " nak-rb-expiry:%" PGM_TIME_FORMAT ")", + (void*)window, txw_lead, txw_trail, nak_rb_expiry); +@@ -549,7 +553,9 @@ + } + + /* remove all buffers between commit lead and advertised rxw_trail */ +- for (uint32_t sequence = window->commit_lead; ++ { ++ uint32_t sequence; ++ for (sequence = window->commit_lead; + pgm_uint32_gt (window->rxw_trail, sequence) && pgm_uint32_gte (window->lead, sequence); + sequence++) + { +@@ -574,6 +580,7 @@ + break; + } + } ++ } + + /* post-conditions: only after flush */ + // pgm_assert (!pgm_rxw_is_full (window)); +@@ -636,6 +643,7 @@ + window->data_loss = window->ack_c_p + pgm_fp16mul ((pgm_fp16 (1) - window->ack_c_p), window->data_loss); + + skb = pgm_alloc_skb (window->max_tpdu); ++ { + pgm_rxw_state_t* state = (pgm_rxw_state_t*)&skb->cb; + skb->tstamp = now; + skb->sequence = window->lead; +@@ -651,6 +659,7 @@ + } + + /* add skb to window */ ++ { + const uint_fast32_t index_ = skb->sequence % pgm_rxw_max_length (window); + window->pdata[index_] = skb; + +@@ -660,6 +669,8 @@ + pgm_assert_cmpuint (pgm_rxw_length (window), >, 0); + pgm_assert_cmpuint (pgm_rxw_length (window), <=, pgm_rxw_max_length (window)); + pgm_assert_cmpuint (_pgm_rxw_incoming_length (window), >, 0); ++ } ++ } + } + + /* add a range of placeholders to the window. +@@ -679,6 +690,7 @@ + pgm_assert (pgm_uint32_gt (sequence, pgm_rxw_lead (window))); + + /* check bounds of commit window */ ++ { + const uint32_t new_commit_sqns = ( 1 + sequence ) - window->trail; + if ( !_pgm_rxw_commit_is_empty (window) && + (new_commit_sqns >= pgm_rxw_max_length (window)) ) +@@ -710,6 +722,7 @@ + pgm_assert (!pgm_rxw_is_full (window)); + + return PGM_RXW_APPENDED; ++ } + } + + /* update leading edge of receive window. +@@ -733,6 +746,7 @@ + if (PGM_UNLIKELY(pgm_uint32_lte (txw_lead, window->lead))) + return 0; + ++ { + uint32_t lead; + + /* committed packets limit constrain the lead until they are released */ +@@ -746,6 +760,7 @@ + else + lead = txw_lead; + ++ { + unsigned lost = 0; + + while (window->lead != lead) +@@ -761,6 +776,8 @@ + } + + return lost; ++ } ++ } + } + + /* checks whether an APDU is unrecoverable due to lost TPDUs. +@@ -786,22 +803,28 @@ + if (!skb->pgm_opt_fragment) + return FALSE; + ++ { + const uint32_t apdu_first_sqn = ntohl (skb->of_apdu_first_sqn); + + /* by definition, first fragment indicates APDU is available */ + if (apdu_first_sqn == skb->sequence) + return FALSE; + ++ { + const struct pgm_sk_buff_t* const first_skb = _pgm_rxw_peek (window, apdu_first_sqn); + /* first fragment out-of-bounds */ + if (NULL == first_skb) + return TRUE; + ++ { + const pgm_rxw_state_t* first_state = (pgm_rxw_state_t*)&first_skb->cb; + if (PGM_PKT_STATE_LOST_DATA == first_state->pkt_state) + return TRUE; + + return FALSE; ++ } ++ } ++ } + } + + /* return the first missing packet sequence in the specified transmission +@@ -821,7 +844,9 @@ + /* pre-conditions */ + pgm_assert (NULL != window); + +- for (uint32_t i = tg_sqn, j = 0; j < window->tg_size; i++, j++) ++ { ++ uint32_t i, j; ++ for (i = tg_sqn, j = 0; j < window->tg_size; i++, j++) + { + skb = _pgm_rxw_peek (window, i); + pgm_assert (NULL != skb); +@@ -840,6 +865,7 @@ + default: pgm_assert_not_reached(); break; + } + } ++ } + + return NULL; + } +@@ -867,6 +893,7 @@ + if (skb->pgm_header->pgm_options & PGM_OPT_VAR_PKTLEN) + return FALSE; + ++ { + const uint32_t tg_sqn = _pgm_rxw_tg_sqn (window, skb->sequence); + if (tg_sqn == skb->sequence) + return FALSE; +@@ -879,6 +906,7 @@ + return FALSE; + + return TRUE; ++ } + } + + static inline +@@ -913,6 +941,7 @@ + if (!window->is_fec_available) + return FALSE; + ++ { + const uint32_t tg_sqn = _pgm_rxw_tg_sqn (window, skb->sequence); + if (tg_sqn == skb->sequence) + return FALSE; +@@ -925,6 +954,7 @@ + return FALSE; + + return TRUE; ++ } + } + + /* insert skb into window range, discard if duplicate. window will have placeholder, +@@ -997,20 +1027,21 @@ + } + + /* statistics */ ++ { + const pgm_time_t fill_time = new_skb->tstamp - skb->tstamp; + PGM_HISTOGRAM_TIMES("Rx.RepairTime", fill_time); + PGM_HISTOGRAM_COUNTS("Rx.NakTransmits", state->nak_transmit_count); + PGM_HISTOGRAM_COUNTS("Rx.NcfRetries", state->ncf_retry_count); + PGM_HISTOGRAM_COUNTS("Rx.DataRetries", state->data_retry_count); + if (!window->max_fill_time) { +- window->max_fill_time = window->min_fill_time = fill_time; ++ window->max_fill_time = window->min_fill_time = (uint32_t)fill_time; + } + else + { + if (fill_time > window->max_fill_time) +- window->max_fill_time = fill_time; ++ window->max_fill_time = (uint32_t)fill_time; + else if (fill_time < window->min_fill_time) +- window->min_fill_time = fill_time; ++ window->min_fill_time = (uint32_t)fill_time; + + if (!window->max_nak_transmit_count) { + window->max_nak_transmit_count = window->min_nak_transmit_count = state->nak_transmit_count; +@@ -1023,6 +1054,7 @@ + } + + /* add packet to bitmap */ ++ { + const uint_fast32_t pos = window->lead - new_skb->sequence; + if (pos < 32) { + window->bitmap |= 1 << pos; +@@ -1033,16 +1065,19 @@ + * x_{t-1} = 0 + * ∴ s_t = (1 - α) × s_{t-1} + */ ++ { + const uint_fast32_t s = pgm_fp16pow (pgm_fp16 (1) - window->ack_c_p, pos); + if (s > window->data_loss) window->data_loss = 0; + else window->data_loss -= s; + + /* replace place holder skb with incoming skb */ + memcpy (new_skb->cb, skb->cb, sizeof(skb->cb)); ++ { + pgm_rxw_state_t* rxw_state = (void*)new_skb->cb; + rxw_state->pkt_state = PGM_PKT_STATE_ERROR; + _pgm_rxw_unlink (window, skb); + pgm_free_skb (skb); ++ { + const uint_fast32_t index_ = new_skb->sequence % pgm_rxw_max_length (window); + window->pdata[index_] = new_skb; + if (new_skb->pgm_header->pgm_options & PGM_OPT_PARITY) +@@ -1052,6 +1087,11 @@ + window->size += new_skb->len; + + return PGM_RXW_INSERTED; ++ } ++ } ++ } ++ } ++ } + } + + /* shuffle parity packet at skb->sequence to any other needed spot. +@@ -1070,11 +1110,13 @@ + pgm_assert (NULL != window); + pgm_assert (NULL != skb); + ++ { + struct pgm_sk_buff_t* restrict missing = _pgm_rxw_find_missing (window, skb->sequence); + if (NULL == missing) + return; + + /* replace place holder skb with parity skb */ ++ { + char cb[48]; + _pgm_rxw_unlink (window, missing); + memcpy (cb, skb->cb, sizeof(skb->cb)); +@@ -1084,6 +1126,8 @@ + window->pdata[index_] = skb; + index_ = missing->sequence % pgm_rxw_max_length (window); + window->pdata[index_] = missing; ++ } ++ } + } + + /* skb advances the window lead. +@@ -1146,11 +1190,13 @@ + lost_skb->sequence = skb->sequence; + + /* add lost-placeholder skb to window */ ++ { + const uint_fast32_t index_ = lost_skb->sequence % pgm_rxw_max_length (window); + window->pdata[index_] = lost_skb; + + _pgm_rxw_state (window, lost_skb, PGM_PKT_STATE_LOST_DATA); + return PGM_RXW_BOUNDS; ++ } + } + + /* add skb to window */ +@@ -1185,6 +1231,7 @@ + /* pre-conditions */ + pgm_assert (NULL != window); + ++ { + const uint32_t tg_sqn_of_commit_lead = _pgm_rxw_tg_sqn (window, window->commit_lead); + + while (!_pgm_rxw_commit_is_empty (window) && +@@ -1192,6 +1239,7 @@ + { + _pgm_rxw_remove_trail (window); + } ++ } + } + + /* flush packets but instead of calling on_data append the contiguous data packets +@@ -1344,7 +1392,9 @@ + pgm_debug ("_pgm_rxw_incoming_read (window:%p pmsg:%p pmsglen:%u)", + (void*)window, (void*)pmsg, pmsglen); + ++ { + msg_end = *pmsg + pmsglen - 1; ++ { + ssize_t bytes_read = 0; + size_t data_read = 0; + +@@ -1363,6 +1413,8 @@ + window->bytes_delivered += bytes_read; + window->msgs_delivered += data_read; + return data_read > 0 ? bytes_read : -1; ++ } ++ } + } + + /* returns TRUE if transmission group is lost. +@@ -1411,16 +1463,19 @@ + skb = _pgm_rxw_peek (window, tg_sqn); + pgm_assert (NULL != skb); + ++ { + const bool is_var_pktlen = skb->pgm_header->pgm_options & PGM_OPT_VAR_PKTLEN; + const bool is_op_encoded = skb->pgm_header->pgm_options & PGM_OPT_PRESENT; + const uint16_t parity_length = ntohs (skb->pgm_header->pgm_tsdu_length); +- struct pgm_sk_buff_t* tg_skbs[ window->rs.n ]; +- pgm_gf8_t* tg_data[ window->rs.n ]; +- pgm_gf8_t* tg_opts[ window->rs.n ]; +- uint8_t offsets[ window->rs.k ]; ++ struct pgm_sk_buff_t** tg_skbs = pgm_newa (struct pgm_sk_buff_t*, window->rs.n); ++ pgm_gf8_t** tg_data = pgm_newa (pgm_gf8_t*, window->rs.n); ++ pgm_gf8_t** tg_opts = pgm_newa (pgm_gf8_t*, window->rs.n); ++ uint8_t* offsets = pgm_newa (uint8_t, window->rs.k); + uint8_t rs_h = 0; + +- for (uint32_t i = tg_sqn, j = 0; i != (tg_sqn + window->rs.k); i++, j++) ++ { ++ uint32_t i, j; ++ for (i = tg_sqn, j = 0; i != (tg_sqn + window->rs.k); i++, j++) + { + skb = _pgm_rxw_peek (window, i); + pgm_assert (NULL != skb); +@@ -1474,6 +1529,7 @@ + } + + } ++ } + + /* reconstruct payload */ + pgm_rs_decode_parity_appended (&window->rs, +@@ -1489,11 +1545,14 @@ + sizeof(struct pgm_opt_fragment)); + + /* swap parity skbs with reconstructed skbs */ +- for (uint_fast8_t i = 0; i < window->rs.k; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < window->rs.k; i++) + { + if (offsets[i] < window->rs.k) + continue; + ++ { + struct pgm_sk_buff_t* repair_skb = tg_skbs[i]; + + if (is_var_pktlen) +@@ -1502,17 +1561,22 @@ + if (pktlen > parity_length) { + pgm_trace (PGM_LOG_ROLE_RX_WINDOW,_("Invalid encoded variable packet length in reconstructed packet, dropping entire transmission group.")); + pgm_free_skb (repair_skb); +- for (uint_fast8_t j = i; j < window->rs.k; j++) ++ { ++ uint_fast8_t j; ++ for (j = i; j < window->rs.k; j++) + { + if (offsets[j] < window->rs.k) + continue; + pgm_rxw_lost (window, tg_skbs[offsets[j]]->sequence); + } ++ } + break; + } ++ { + const uint16_t padding = parity_length - pktlen; + repair_skb->len -= padding; + repair_skb->tail = (char*)repair_skb->tail - padding; ++ } + } + + #ifdef PGM_DISABLE_ASSERT +@@ -1520,6 +1584,9 @@ + #else + pgm_assert_cmpint (_pgm_rxw_insert (window, repair_skb), ==, PGM_RXW_INSERTED); + #endif ++ } ++ } ++ } + } + } + +@@ -1559,6 +1626,7 @@ + return FALSE; + } + ++ { + const size_t apdu_size = skb->pgm_opt_fragment ? ntohl (skb->of_apdu_len) : skb->len; + const uint32_t tg_sqn = _pgm_rxw_tg_sqn (window, first_sequence); + uint32_t sequence = first_sequence; +@@ -1643,6 +1711,7 @@ + + /* pending */ + return FALSE; ++ } + } + + /* read one APDU consisting of one or more TPDUs. target array is guaranteed +@@ -1666,6 +1735,7 @@ + (const void*)window, (const void*)pmsg); + + skb = _pgm_rxw_peek (window, window->commit_lead); ++ { + size_t contiguous_len = 0; + const size_t apdu_len = skb->pgm_opt_fragment ? ntohl (skb->of_apdu_len) : skb->len; + unsigned i = 0; +@@ -1687,7 +1757,8 @@ + /* post-conditions */ + pgm_assert (!_pgm_rxw_commit_is_empty (window)); + +-return contiguous_len; ++ return contiguous_len; ++ } + } + + /* returns transmission group sequence (TG_SQN) from sequence (SQN). +@@ -1703,8 +1774,10 @@ + /* pre-conditions */ + pgm_assert (NULL != window); + ++ { + const uint32_t tg_sqn_mask = 0xffffffff << window->tg_sqn_shift; + return sequence & tg_sqn_mask; ++ } + } + + /* returns packet number (PKT_SQN) from sequence (SQN). +@@ -1720,8 +1793,10 @@ + /* pre-conditions */ + pgm_assert (NULL != window); + ++ { + const uint32_t tg_sqn_mask = 0xffffffff << window->tg_sqn_shift; + return sequence & ~tg_sqn_mask; ++ } + } + + /* returns TRUE when the sequence is the first of a transmission group. +@@ -1849,6 +1924,7 @@ + pgm_assert (NULL != window); + pgm_assert (NULL != skb); + ++ { + pgm_rxw_state_t* state = (pgm_rxw_state_t*)&skb->cb; + + switch (state->pkt_state) { +@@ -1898,6 +1974,7 @@ + state->pkt_state = PGM_PKT_STATE_ERROR; + pgm_assert (((pgm_list_t*)skb)->next == NULL); + pgm_assert (((pgm_list_t*)skb)->prev == NULL); ++ } + } + + /* returns the pointer at the given index of the window. +@@ -2017,8 +2094,10 @@ + pgm_assert (NULL != window); + + /* fetch skb from window and bump expiration times */ ++ { + struct pgm_sk_buff_t* skb = _pgm_rxw_peek (window, sequence); + pgm_assert (NULL != skb); ++ { + pgm_rxw_state_t* state = (pgm_rxw_state_t*)&skb->cb; + switch (state->pkt_state) { + case PGM_PKT_STATE_BACK_OFF: +@@ -2040,6 +2119,8 @@ + } + + return PGM_RXW_DUPLICATE; ++ } ++ } + } + + /* append an skb to the incoming window with WAIT-DATA state. +@@ -2085,16 +2166,20 @@ + window->data_loss = window->ack_c_p + pgm_fp16mul (pgm_fp16 (1) - window->ack_c_p, window->data_loss); + + skb = pgm_alloc_skb (window->max_tpdu); ++ { + pgm_rxw_state_t* state = (pgm_rxw_state_t*)&skb->cb; + skb->tstamp = now; + skb->sequence = window->lead; + state->timer_expiry = nak_rdata_expiry; + ++ { + const uint_fast32_t index_ = pgm_rxw_lead (window) % pgm_rxw_max_length (window); + window->pdata[index_] = skb; + _pgm_rxw_state (window, skb, PGM_PKT_STATE_WAIT_DATA); + + return PGM_RXW_APPENDED; ++ } ++ } + } + + /* dumps window state to stdout +@@ -2133,7 +2218,7 @@ + "cumulative_losses = %" PRIu32 ", " + "bytes_delivered = %" PRIu32 ", " + "msgs_delivered = %" PRIu32 ", " +- "size = %zu, " ++ "size = %lu, " + "alloc = %" PRIu32 ", " + "pdata = []" + "}", diff --git a/3rdparty/openpgm-svn-r1085/pgm/rxw_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/rxw_unittest.c index 635c854..635c854 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/rxw_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/rxw_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/signal.c b/3rdparty/openpgm-svn-r1135/pgm/signal.c index 1279a8f..ab1fb86 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/signal.c +++ b/3rdparty/openpgm-svn-r1135/pgm/signal.c @@ -19,7 +19,10 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define _GNU_SOURCE +#ifndef _GNU_SOURCE +# define _GNU_SOURCE +#endif + #include <fcntl.h> #include <signal.h> /* _GNU_SOURCE for strsignal() */ #include <glib.h> diff --git a/3rdparty/openpgm-svn-r1085/pgm/signal_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/signal_unittest.c index 4784053..4784053 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/signal_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/signal_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/skbuff.c b/3rdparty/openpgm-svn-r1135/pgm/skbuff.c index 5db6ffc..5db6ffc 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/skbuff.c +++ b/3rdparty/openpgm-svn-r1135/pgm/skbuff.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/slist.c b/3rdparty/openpgm-svn-r1135/pgm/slist.c index 9ba68ea..9ba68ea 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/slist.c +++ b/3rdparty/openpgm-svn-r1135/pgm/slist.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/snmp.c b/3rdparty/openpgm-svn-r1135/pgm/snmp.c index 5673878..5673878 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/snmp.c +++ b/3rdparty/openpgm-svn-r1135/pgm/snmp.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/snmp_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/snmp_unittest.c index 9005a82..9005a82 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/snmp_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/snmp_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/sockaddr.c b/3rdparty/openpgm-svn-r1135/pgm/sockaddr.c index 9b8dcb9..df43d26 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/sockaddr.c +++ b/3rdparty/openpgm-svn-r1135/pgm/sockaddr.c @@ -33,7 +33,7 @@ # define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP #endif /* OpenSolaris differences */ -#ifndef MCAST_MSFILTER +#if !defined(_WIN32) && !defined(MCAST_MSFILTER) # include <sys/ioctl.h> #endif #ifndef SOL_IP @@ -865,7 +865,7 @@ pgm_sockaddr_multicast_if ( * Stevens: "IP_MULTICAST_IF has datatype struct in_addr{}." */ struct sockaddr_in s4; - memcpy (&s4, address, sizeof(s4)); + memcpy (&s4, address, sizeof(struct sockaddr_in)); retval = setsockopt (s, IPPROTO_IP, IP_MULTICAST_IF, (const char*)&s4.sin_addr, sizeof(s4.sin_addr)); break; } diff --git a/3rdparty/openpgm-svn-r1135/pgm/sockaddr.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/sockaddr.c.c89.patch new file mode 100644 index 0000000..96fa367 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/sockaddr.c.c89.patch @@ -0,0 +1,75 @@ +--- sockaddr.c 2010-08-04 17:08:05.000000000 +0800 ++++ sockaddr.c89 2010-08-05 13:19:20.000000000 +0800 +@@ -145,12 +145,13 @@ + struct sockaddr* restrict dst /* will error on wrong size */ + ) + { +- struct addrinfo hints = { +- .ai_family = AF_UNSPEC, +- .ai_socktype = SOCK_STREAM, /* not really */ +- .ai_protocol = IPPROTO_TCP, /* not really */ +- .ai_flags = AI_NUMERICHOST +- }, *result = NULL; ++ struct addrinfo hints, *result; ++ memset (&hints, 0, sizeof(hints)); ++ hints.ai_family = AF_UNSPEC; ++ hints.ai_socktype = SOCK_STREAM; /* not really */ ++ hints.ai_protocol = IPPROTO_TCP; /* not really */ ++ hints.ai_flags = AI_NUMERICHOST; ++ { + const int status = getaddrinfo (src, NULL, &hints, &result); + if (PGM_LIKELY(0 == status)) { + memcpy (dst, result->ai_addr, result->ai_addrlen); +@@ -158,6 +159,7 @@ + return 1; + } + return 0; ++ } + } + + /* returns tri-state value: 1 if sa is multicast, 0 if sa is not multicast, -1 on error +@@ -830,7 +832,13 @@ + const socklen_t len = GROUP_FILTER_SIZE(gf_list->gf_numsrc); + retval = setsockopt (s, recv_level, MCAST_MSFILTER, (const char*)gf_list, len); + #elif defined(SIOCSMSFILTER) ++# ifdef _WIN32 ++# pragma warning( disable : 4090 ) ++ retval = ioctlsocket (s, SIOCSMSFILTER, (const char*)gf_list); ++# pragma warning( default : 4090 ) ++# else + retval = ioctl (s, SIOCSMSFILTER, (const char*)gf_list); ++# endif + #endif + return retval; + } +@@ -1092,13 +1100,15 @@ + pgm_assert (NULL != src); + pgm_assert (NULL != dst); + +- struct addrinfo hints = { +- .ai_family = af, +- .ai_socktype = SOCK_STREAM, /* not really */ +- .ai_protocol = IPPROTO_TCP, /* not really */ +- .ai_flags = AI_NUMERICHOST +- }, *result = NULL; ++ { ++ struct addrinfo hints, *result; ++ memset (&hints, 0, sizeof(hints)); ++ hints.ai_family = af; ++ hints.ai_socktype = SOCK_STREAM; /* not really */ ++ hints.ai_protocol = IPPROTO_TCP; /* not really */ ++ hints.ai_flags = AI_NUMERICHOST; + ++ { + const int e = getaddrinfo (src, NULL, &hints, &result); + if (0 != e) { + return 0; /* error */ +@@ -1129,6 +1139,8 @@ + + freeaddrinfo (result); + return 1; /* success */ ++ } ++ } + } + + int diff --git a/3rdparty/openpgm-svn-r1085/pgm/socket.c b/3rdparty/openpgm-svn-r1135/pgm/socket.c index 1338085..f838f18 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/socket.c +++ b/3rdparty/openpgm-svn-r1135/pgm/socket.c @@ -56,9 +56,9 @@ pgm_pkt_offset ( sa_family_t pgmcc_family /* 0 = disable */ ) { - static const size_t data_size = sizeof(struct pgm_header) + sizeof(struct pgm_data); + const size_t data_size = sizeof(struct pgm_header) + sizeof(struct pgm_data); size_t pkt_size = data_size; - if (can_fragment || 0 != pgmcc_family) + if (can_fragment || (0 != pgmcc_family)) pkt_size += sizeof(struct pgm_opt_length) + sizeof(struct pgm_opt_header); if (can_fragment) pkt_size += sizeof(struct pgm_opt_fragment); @@ -316,6 +316,76 @@ pgm_socket ( goto err_destroy; } + if (IPPROTO_UDP == new_sock->protocol) + { +/* Stevens: "SO_REUSEADDR has datatype int." + */ + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Set socket sharing.")); + const int v = 1; + if (PGM_SOCKET_ERROR == setsockopt (new_sock->recv_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&v, sizeof(v)) || + PGM_SOCKET_ERROR == setsockopt (new_sock->send_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&v, sizeof(v)) || + PGM_SOCKET_ERROR == setsockopt (new_sock->send_with_router_alert_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&v, sizeof(v))) + { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + _("Enabling reuse of socket local address: %s"), + pgm_sock_strerror (save_errno)); + goto err_destroy; + } + +/* request extra packet information to determine destination address on each packet */ +#ifndef CONFIG_TARGET_WINE + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Request socket packet-info.")); + const sa_family_t recv_family = new_sock->family; + if (PGM_SOCKET_ERROR == pgm_sockaddr_pktinfo (new_sock->recv_sock, recv_family, TRUE)) + { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + _("Enabling receipt of ancillary information per incoming packet: %s"), + pgm_sock_strerror (save_errno)); + goto err_destroy; + } +#endif + } + else + { + const sa_family_t recv_family = new_sock->family; + if (AF_INET == recv_family) + { +/* include IP header only for incoming data, only works for IPv4 */ + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Request IP headers.")); + if (PGM_SOCKET_ERROR == pgm_sockaddr_hdrincl (new_sock->recv_sock, recv_family, TRUE)) + { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + _("Enabling IP header in front of user data: %s"), + pgm_sock_strerror (save_errno)); + goto err_destroy; + } + } + else + { + pgm_assert (AF_INET6 == recv_family); + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Request socket packet-info.")); + if (PGM_SOCKET_ERROR == pgm_sockaddr_pktinfo (new_sock->recv_sock, recv_family, TRUE)) + { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + _("Enabling receipt of control message per incoming datagram: %s"), + pgm_sock_strerror (save_errno)); + goto err_destroy; + } + } + } + *sock = new_sock; pgm_rwlock_writer_lock (&pgm_sock_list_lock); @@ -356,6 +426,7 @@ err_destroy: bool pgm_getsockopt ( pgm_sock_t* const restrict sock, + const int level, /* always IPPROTO_PGM */ const int optname, void* restrict optval, socklen_t* restrict optlen /* required */ @@ -363,6 +434,7 @@ pgm_getsockopt ( { bool status = FALSE; pgm_return_val_if_fail (sock != NULL, status); + pgm_return_val_if_fail (level == IPPROTO_PGM, status); pgm_return_val_if_fail (optval != NULL, status); pgm_return_val_if_fail (optlen != NULL, status); if (PGM_UNLIKELY(!pgm_rwlock_reader_trylock (&sock->lock))) @@ -372,7 +444,7 @@ pgm_getsockopt ( return status; } switch (optname) { -/* maximum TPDU size */ +/* maximum transmission packet size */ case PGM_MTU: if (PGM_UNLIKELY(*optlen != sizeof (int))) break; @@ -380,6 +452,47 @@ pgm_getsockopt ( status = TRUE; break; +/* maximum segment size for unfragmented APDU */ + case PGM_MSSS: + if (PGM_UNLIKELY(*optlen != sizeof (int))) + break; + *(int*restrict)optval = sock->max_tsdu; + status = TRUE; + break; + +/* maximum segment size for fragmented APDU */ + case PGM_MSS: + if (PGM_UNLIKELY(*optlen != sizeof (int))) + break; + *(int*restrict)optval = sock->max_tsdu_fragment; + status = TRUE; + break; + +/* maximum payload size for an APDU */ + case PGM_PDU: + if (PGM_UNLIKELY(*optlen != sizeof (int))) + break; + *(int*restrict)optval = sock->max_apdu; + status = TRUE; + break; + + case PGM_ABORT_ON_RESET: + if (PGM_UNLIKELY(*optlen != sizeof (int))) + break; + *(int*restrict)optval = sock->is_abort_on_reset ? 1 : 0; + status = TRUE; + break; + +/* send socket */ + case PGM_SEND_SOCK: + if (PGM_UNLIKELY(!sock->is_connected)) + break; + if (PGM_UNLIKELY(*optlen != sizeof (int))) + break; + *(int*)optval = sock->send_sock; + status = TRUE; + break; + /* receive socket */ case PGM_RECV_SOCK: if (PGM_UNLIKELY(!sock->is_connected)) @@ -462,6 +575,7 @@ pgm_getsockopt ( bool pgm_setsockopt ( pgm_sock_t* const sock, + const int level, /* IPPROTO_PGM or SOL_SOCKET */ const int optname, const void* optval, const socklen_t optlen @@ -469,12 +583,45 @@ pgm_setsockopt ( { bool status = FALSE; pgm_return_val_if_fail (sock != NULL, status); + pgm_return_val_if_fail (IPPROTO_PGM == level || SOL_SOCKET == level, status); if (PGM_UNLIKELY(!pgm_rwlock_reader_trylock (&sock->lock))) pgm_return_val_if_reached (status); if (PGM_UNLIKELY(sock->is_connected || sock->is_destroyed)) { pgm_rwlock_reader_unlock (&sock->lock); return status; } + + switch (level) { + case SOL_SOCKET: + switch (optname) { + +/* 0 < wmem < wmem_max (user) + * + * operating system and sysctl dependent maximum, minimum on Linux 256 (doubled). + */ + case SO_SNDBUF: + if (PGM_SOCKET_ERROR == setsockopt (sock->send_sock, SOL_SOCKET, SO_SNDBUF, (const char*)optval, optlen) || + PGM_SOCKET_ERROR == setsockopt (sock->send_with_router_alert_sock, SOL_SOCKET, SO_SNDBUF, (const char*)optval, optlen)) + break; + status = TRUE; + break; + +/* 0 < rmem < rmem_max (user) + * + * minimum on Linux is 2048 (doubled). + */ + case SO_RCVBUF: + if (PGM_SOCKET_ERROR == setsockopt (sock->recv_sock, SOL_SOCKET, SO_RCVBUF, (const char*)optval, optlen)) + break; + status = TRUE; + break; + + default: + break; + } + break; + + case IPPROTO_PGM: switch (optname) { /* RFC2113 IP Router Alert @@ -496,7 +643,7 @@ pgm_setsockopt ( case PGM_MTU: if (PGM_UNLIKELY(optlen != sizeof (int))) break; - if (PGM_UNLIKELY(*(const int*)optval < (sizeof(struct pgm_ip) + sizeof(struct pgm_header)))) + if (PGM_UNLIKELY(*(const int*)optval < (int)(sizeof(struct pgm_ip) + sizeof(struct pgm_header)))) break; if (PGM_UNLIKELY(*(const int*)optval > UINT16_MAX)) break; @@ -535,9 +682,9 @@ pgm_setsockopt ( if (PGM_UNLIKELY(*(const int*)optval > UINT8_MAX)) break; { - const unsigned hops = *(const int*)optval; - if (PGM_SOCKET_ERROR == pgm_sockaddr_multicast_hops (sock->send_sock, sock->family, hops) || - PGM_SOCKET_ERROR == pgm_sockaddr_multicast_hops (sock->send_with_router_alert_sock, sock->family, hops)) + sock->hops = *(const int*)optval; + if (PGM_SOCKET_ERROR == pgm_sockaddr_multicast_hops (sock->send_sock, sock->family, sock->hops) || + PGM_SOCKET_ERROR == pgm_sockaddr_multicast_hops (sock->send_with_router_alert_sock, sock->family, sock->hops)) break; } #endif @@ -558,27 +705,6 @@ pgm_setsockopt ( status = TRUE; break; -/* 0 < wmem < wmem_max (user) - * - * operating system and sysctl dependent maximum, minimum on Linux 256 (doubled). - */ - case PGM_SNDBUF: - if (PGM_SOCKET_ERROR == setsockopt (sock->send_sock, SOL_SOCKET, SO_SNDBUF, (const char*)optval, optlen) || - PGM_SOCKET_ERROR == setsockopt (sock->send_with_router_alert_sock, SOL_SOCKET, SO_SNDBUF, (const char*)optval, optlen)) - break; - status = TRUE; - break; - -/* 0 < rmem < rmem_max (user) - * - * minimum on Linux is 2048 (doubled). - */ - case PGM_RCVBUF: - if (PGM_SOCKET_ERROR == setsockopt (sock->recv_sock, SOL_SOCKET, SO_RCVBUF, (const char*)optval, optlen)) - break; - status = TRUE; - break; - /* periodic ambient broadcast SPM interval in milliseconds. */ case PGM_AMBIENT_SPM: @@ -613,7 +739,7 @@ pgm_setsockopt ( break; if (PGM_UNLIKELY(*(const int*)optval <= 0)) break; - if (PGM_UNLIKELY(*(const int*)optval >= ((UINT32_MAX/2)-1))) + if (PGM_UNLIKELY(*(const int*)optval >= (int)((UINT32_MAX/2)-1))) break; sock->txw_sqns = *(const int*)optval; status = TRUE; @@ -678,7 +804,7 @@ pgm_setsockopt ( break; if (PGM_UNLIKELY(*(const int*)optval <= 0)) break; - if (PGM_UNLIKELY(*(const int*)optval >= ((UINT32_MAX/2)-1))) + if (PGM_UNLIKELY(*(const int*)optval >= (int)((UINT32_MAX/2)-1))) break; sock->rxw_sqns = *(const int*)optval; status = TRUE; @@ -892,18 +1018,36 @@ pgm_setsockopt ( status = TRUE; break; -/* sending group, singular. +/* sending group, singular. note that the address is only stored and used + * later in sendto() calls, this routine only considers the interface. */ case PGM_SEND_GROUP: if (PGM_UNLIKELY(optlen != sizeof(struct group_req))) break; - memcpy (&sock->send_gsr, optval, optlen); - ((struct sockaddr_in*)&sock->send_gsr.gsr_group)->sin_port = htons (sock->udp_encap_mcast_port); + memcpy (&sock->send_gsr, optval, sizeof(struct group_req)); if (PGM_UNLIKELY(sock->family != sock->send_gsr.gsr_group.ss_family)) break; - if (PGM_SOCKET_ERROR == pgm_sockaddr_multicast_if (sock->send_sock, (const struct sockaddr*)&sock->send_gsr.gsr_group, sock->send_gsr.gsr_interface) || - PGM_SOCKET_ERROR == pgm_sockaddr_multicast_if (sock->send_with_router_alert_sock, (const struct sockaddr*)&sock->send_gsr.gsr_group, sock->send_gsr.gsr_interface)) +/* multicast group for later usage with sendto() */ + if (sock->udp_encap_mcast_port) + ((struct sockaddr_in*)&sock->send_gsr.gsr_group)->sin_port = htons (sock->udp_encap_mcast_port); +/* interface */ + if ((PGM_SOCKET_ERROR == pgm_sockaddr_multicast_if (sock->send_sock, + (const struct sockaddr*)&sock->send_addr, + sock->send_gsr.gsr_interface)) || + (PGM_SOCKET_ERROR == pgm_sockaddr_multicast_if (sock->send_with_router_alert_sock, + (const struct sockaddr*)&sock->send_addr, + sock->send_gsr.gsr_interface))) + { break; + } + else if (PGM_UNLIKELY(pgm_log_mask & PGM_LOG_ROLE_NETWORK)) + { + char addr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((const struct sockaddr*)&sock->send_addr, addr, sizeof(addr)); + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Multicast send interface set to %s index %u"), + addr, + (unsigned)sock->send_gsr.gsr_interface); + } status = TRUE; break; @@ -938,11 +1082,21 @@ pgm_setsockopt ( } if (PGM_UNLIKELY(sock->family != gr->gr_group.ss_family)) break; - if (PGM_SOCKET_ERROR == pgm_sockaddr_join_group (sock->recv_sock, sock->family, gr)) - break; sock->recv_gsr[sock->recv_gsr_len].gsr_interface = gr->gr_interface; memcpy (&sock->recv_gsr[sock->recv_gsr_len].gsr_group, &gr->gr_group, pgm_sockaddr_len ((const struct sockaddr*)&gr->gr_group)); + if (sock->udp_encap_mcast_port) + ((struct sockaddr_in*)&sock->recv_gsr[sock->recv_gsr_len].gsr_group)->sin_port = htons (sock->udp_encap_mcast_port); memcpy (&sock->recv_gsr[sock->recv_gsr_len].gsr_source, &gr->gr_group, pgm_sockaddr_len ((const struct sockaddr*)&gr->gr_group)); + if (PGM_SOCKET_ERROR == pgm_sockaddr_join_group (sock->recv_sock, sock->family, gr)) + break; + else if (PGM_UNLIKELY(pgm_log_mask & PGM_LOG_ROLE_NETWORK)) + { + char addr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((const struct sockaddr*)&gr->gr_group, addr, sizeof(addr)); + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Join multicast group %s on interface index %u"), + addr, + (unsigned)gr->gr_interface); + } sock->recv_gsr_len++; } status = TRUE; @@ -978,6 +1132,14 @@ pgm_setsockopt ( break; if (PGM_SOCKET_ERROR == pgm_sockaddr_leave_group (sock->recv_sock, sock->family, gr)) break; + else if (PGM_UNLIKELY(pgm_log_mask & PGM_LOG_ROLE_NETWORK)) + { + char addr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((const struct sockaddr*)&gr->gr_group, addr, sizeof(addr)); + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Leave multicast group %s on interface index %u"), + addr, + (unsigned)gr->gr_interface); + } } status = TRUE; break; @@ -1098,11 +1260,11 @@ pgm_setsockopt ( /* batch block and unblock sources */ case PGM_MSFILTER: #if defined(MCAST_MSFILTER) || defined(SIOCSMSFILTER) - if (PGM_UNLIKELY(optlen < sizeof(struct group_filter))) + if (PGM_UNLIKELY(optlen < (socklen_t)sizeof(struct group_filter))) break; { const struct group_filter* gf_list = optval; - if (GROUP_FILTER_SIZE( gf_list->gf_numsrc ) != optlen) + if ((socklen_t)GROUP_FILTER_SIZE( gf_list->gf_numsrc ) != optlen) break; if (PGM_UNLIKELY(sock->family != gf_list->gf_group.ss_family)) break; @@ -1131,6 +1293,13 @@ pgm_setsockopt ( status = TRUE; break; + default: + break; + } + break; + + default: + break; } pgm_rwlock_reader_unlock (&sock->lock); @@ -1158,11 +1327,11 @@ pgm_bind ( bool pgm_bind3 ( pgm_sock_t* restrict sock, - const struct pgm_sockaddr_t* restrict sockaddr, + const struct pgm_sockaddr_t*const restrict sockaddr, const socklen_t sockaddrlen, - const struct pgm_interface_req_t* send_req, /* only use gr_interface and gr_group::sin6_scope */ + const struct pgm_interface_req_t*const send_req, /* only use gr_interface and gr_group::sin6_scope */ const socklen_t send_req_len, - const struct pgm_interface_req_t* recv_req, + const struct pgm_interface_req_t*const recv_req, const socklen_t recv_req_len, pgm_error_t** restrict error /* maybe NULL */ ) @@ -1316,11 +1485,6 @@ pgm_bind3 ( } while (sock->tsi.sport == sock->dport); } -/* UDP encapsulation port */ - if (sock->udp_encap_mcast_port) { - ((struct sockaddr_in*)&sock->send_gsr.gsr_group)->sin_port = htons (sock->udp_encap_mcast_port); - } - /* pseudo-random number generator for back-off intervals */ pgm_rand_create (&sock->rand_); @@ -1415,80 +1579,6 @@ pgm_bind3 ( pgm_assert (NULL != sock->peers_hashtable); } - if (IPPROTO_UDP == sock->protocol) - { -/* Stevens: "SO_REUSEADDR has datatype int." - */ - pgm_trace (PGM_LOG_ROLE_NETWORK,_("Set socket sharing.")); - const int v = 1; - if (PGM_SOCKET_ERROR == setsockopt (sock->recv_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&v, sizeof(v)) || - PGM_SOCKET_ERROR == setsockopt (sock->send_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&v, sizeof(v)) || - PGM_SOCKET_ERROR == setsockopt (sock->send_with_router_alert_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&v, sizeof(v))) - { - const int save_errno = pgm_sock_errno(); - pgm_set_error (error, - PGM_ERROR_DOMAIN_SOCKET, - pgm_error_from_sock_errno (save_errno), - _("Enabling reuse of socket local address: %s"), - pgm_sock_strerror (save_errno)); - pgm_rwlock_writer_unlock (&sock->lock); - return FALSE; - } - -/* request extra packet information to determine destination address on each packet */ -#ifndef CONFIG_TARGET_WINE - pgm_trace (PGM_LOG_ROLE_NETWORK,_("Request socket packet-info.")); - const sa_family_t recv_family = sock->family; - if (PGM_SOCKET_ERROR == pgm_sockaddr_pktinfo (sock->recv_sock, recv_family, TRUE)) - { - const int save_errno = pgm_sock_errno(); - pgm_set_error (error, - PGM_ERROR_DOMAIN_SOCKET, - pgm_error_from_sock_errno (save_errno), - _("Enabling receipt of ancillary information per incoming packet: %s"), - pgm_sock_strerror (save_errno)); - pgm_rwlock_writer_unlock (&sock->lock); - return FALSE; - } -#endif - } - else - { - const sa_family_t recv_family = sock->family; - if (AF_INET == recv_family) - { -/* include IP header only for incoming data, only works for IPv4 */ - pgm_trace (PGM_LOG_ROLE_NETWORK,_("Request IP headers.")); - if (PGM_SOCKET_ERROR == pgm_sockaddr_hdrincl (sock->recv_sock, recv_family, TRUE)) - { - const int save_errno = pgm_sock_errno(); - pgm_set_error (error, - PGM_ERROR_DOMAIN_SOCKET, - pgm_error_from_sock_errno (save_errno), - _("Enabling IP header in front of user data: %s"), - pgm_sock_strerror (save_errno)); - pgm_rwlock_writer_unlock (&sock->lock); - return FALSE; - } - } - else - { - pgm_assert (AF_INET6 == recv_family); - pgm_trace (PGM_LOG_ROLE_NETWORK,_("Request socket packet-info.")); - if (PGM_SOCKET_ERROR == pgm_sockaddr_pktinfo (sock->recv_sock, recv_family, TRUE)) - { - const int save_errno = pgm_sock_errno(); - pgm_set_error (error, - PGM_ERROR_DOMAIN_SOCKET, - pgm_error_from_sock_errno (save_errno), - _("Enabling receipt of control message per incoming datagram: %s"), - pgm_sock_strerror (save_errno)); - pgm_rwlock_writer_unlock (&sock->lock); - return FALSE; - } - } - } - /* Bind UDP sockets to interfaces, note multicast on a bound interface is * fruity on some platforms. Roughly, binding to INADDR_ANY provides all * data, binding to the multicast group provides only multicast traffic, @@ -1522,7 +1612,7 @@ pgm_bind3 ( recv_addr.s6.sin6_family = AF_INET6; recv_addr.s6.sin6_addr = in6addr_any; } - pgm_trace (PGM_LOG_ROLE_NETWORK,_("Binding receive socket to INADDR_ANY.")); + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Binding receive socket to INADDR_ANY")); #else if (!pgm_if_indextoaddr (recv_req->ir_interface, sock->family, @@ -1533,14 +1623,24 @@ pgm_bind3 ( pgm_rwlock_writer_unlock (&sock->lock); return FALSE; } - pgm_trace (PGM_LOG_ROLE_NETWORK,_("Binding receive socket to interface index %u scope %u"), - recv_req->ir_interface, - recv_req->ir_scope_id); + else if (PGM_UNLIKELY(pgm_log_mask & PGM_LOG_ROLE_NETWORK)) + { + if (AF_INET6 == sock_family) + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Binding receive socket to interface index %u scope %u"), + recv_req->ir_interface, + recv_req->ir_scope_id); + else + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Binding receive socket to interface index %u"), + recv_req->ir_interface); + } #endif /* CONFIG_BIND_INADDR_ANY */ memcpy (&recv_addr2.sa, &recv_addr.sa, pgm_sockaddr_len (&recv_addr.sa)); + +/* UDP port */ ((struct sockaddr_in*)&recv_addr)->sin_port = htons (sock->udp_encap_mcast_port); + if (PGM_SOCKET_ERROR == bind (sock->recv_sock, &recv_addr.sa, pgm_sockaddr_len (&recv_addr.sa))) @@ -1579,9 +1679,13 @@ pgm_bind3 ( } else if (PGM_UNLIKELY(pgm_log_mask & PGM_LOG_ROLE_NETWORK)) { - pgm_trace (PGM_LOG_ROLE_NETWORK,_("Binding send socket to interface index %u scope %u"), - send_req->ir_interface, - send_req->ir_scope_id); + if (AF_INET6 == sock->family) + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Binding send socket to interface index %u scope %u"), + send_req->ir_interface, + send_req->ir_scope_id); + else + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Binding send socket to interface index %u"), + send_req->ir_interface); } memcpy (&send_with_router_alert_addr, &send_addr, pgm_sockaddr_len ((struct sockaddr*)&send_addr)); diff --git a/3rdparty/openpgm-svn-r1135/pgm/socket.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/socket.c.c89.patch new file mode 100644 index 0000000..ee48d8f --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/socket.c.c89.patch @@ -0,0 +1,403 @@ +--- socket.c 2010-08-04 17:24:23.000000000 +0800 ++++ socket.c89 2010-08-05 11:24:10.000000000 +0800 +@@ -243,7 +243,9 @@ + new_sock->adv_mode = 0; /* advance with time */ + + /* PGMCC */ ++#pragma warning( disable : 4244 ) + new_sock->acker_nla.ss_family = family; ++#pragma warning( default : 4244 ) + + /* source-side */ + pgm_mutex_init (&new_sock->source_mutex); +@@ -261,6 +263,7 @@ + pgm_rwlock_init (&new_sock->lock); + + /* open sockets to implement PGM */ ++ { + int socket_type; + if (IPPROTO_UDP == new_sock->protocol) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Opening UDP encapsulated sockets.")); +@@ -351,6 +354,7 @@ + } + pgm_free (new_sock); + return FALSE; ++ } + } + + bool +@@ -432,8 +436,8 @@ + { + struct timeval* tv = optval; + const pgm_time_t usecs = pgm_timer_expiration (sock); +- tv->tv_sec = usecs / 1000000UL; +- tv->tv_usec = usecs % 1000000UL; ++ tv->tv_sec = (long)(usecs / 1000000UL); ++ tv->tv_usec = (long)(usecs % 1000000UL); + } + status = TRUE; + break; +@@ -447,8 +451,8 @@ + { + struct timeval* tv = optval; + const pgm_time_t usecs = pgm_rate_remaining (&sock->rate_control, sock->blocklen); +- tv->tv_sec = usecs / 1000000UL; +- tv->tv_usec = usecs % 1000000UL; ++ tv->tv_sec = (long)(usecs / 1000000UL); ++ tv->tv_usec = (long)(usecs % 1000000UL); + } + status = TRUE; + break; +@@ -599,8 +603,11 @@ + sock->spm_heartbeat_len = optlen / sizeof (int); + sock->spm_heartbeat_interval = pgm_new (unsigned, sock->spm_heartbeat_len + 1); + sock->spm_heartbeat_interval[0] = 0; +- for (unsigned i = 0; i < sock->spm_heartbeat_len; i++) ++ { ++ unsigned i; ++ for (i = 0; i < sock->spm_heartbeat_len; i++) + sock->spm_heartbeat_interval[i + 1] = ((const int*)optval)[i]; ++ } + } + status = TRUE; + break; +@@ -795,6 +802,7 @@ + break; + if (PGM_UNLIKELY(fecinfo->group_size > fecinfo->block_size)) + break; ++ { + const uint8_t parity_packets = fecinfo->block_size - fecinfo->group_size; + /* technically could re-send previous packets */ + if (PGM_UNLIKELY(fecinfo->proactive_packets > parity_packets)) +@@ -811,6 +819,7 @@ + sock->rs_n = fecinfo->block_size; + sock->rs_k = fecinfo->group_size; + sock->rs_proactive_h = fecinfo->proactive_packets; ++ } + } + status = TRUE; + break; +@@ -916,7 +925,9 @@ + { + const struct group_req* gr = optval; + /* verify not duplicate group/interface pairing */ +- for (unsigned i = 0; i < sock->recv_gsr_len; i++) ++ { ++ unsigned i; ++ for (i = 0; i < sock->recv_gsr_len; i++) + { + if (pgm_sockaddr_cmp ((const struct sockaddr*)&gr->gr_group, (struct sockaddr*)&sock->recv_gsr[i].gsr_group) == 0 && + pgm_sockaddr_cmp ((const struct sockaddr*)&gr->gr_group, (struct sockaddr*)&sock->recv_gsr[i].gsr_source) == 0 && +@@ -935,6 +946,7 @@ + break; + } + } ++ } + if (PGM_UNLIKELY(sock->family != gr->gr_group.ss_family)) + break; + if (PGM_SOCKET_ERROR == pgm_sockaddr_join_group (sock->recv_sock, sock->family, gr)) +@@ -956,7 +968,9 @@ + break; + { + const struct group_req* gr = optval; +- for (unsigned i = 0; i < sock->recv_gsr_len;) ++ { ++ unsigned i; ++ for (i = 0; i < sock->recv_gsr_len;) + { + if ((pgm_sockaddr_cmp ((const struct sockaddr*)&gr->gr_group, (struct sockaddr*)&sock->recv_gsr[i].gsr_group) == 0) && + /* drop all matching receiver entries */ +@@ -973,6 +987,7 @@ + } + i++; + } ++ } + if (PGM_UNLIKELY(sock->family != gr->gr_group.ss_family)) + break; + if (PGM_SOCKET_ERROR == pgm_sockaddr_leave_group (sock->recv_sock, sock->family, gr)) +@@ -1023,7 +1038,9 @@ + { + const struct group_source_req* gsr = optval; + /* verify if existing group/interface pairing */ +- for (unsigned i = 0; i < sock->recv_gsr_len; i++) ++ { ++ unsigned i; ++ for (i = 0; i < sock->recv_gsr_len; i++) + { + if (pgm_sockaddr_cmp ((const struct sockaddr*)&gsr->gsr_group, (struct sockaddr*)&sock->recv_gsr[i].gsr_group) == 0 && + (gsr->gsr_interface == sock->recv_gsr[i].gsr_interface || +@@ -1048,6 +1065,7 @@ + break; + } + } ++ } + if (PGM_UNLIKELY(sock->family != gsr->gsr_group.ss_family)) + break; + if (PGM_UNLIKELY(sock->family != gsr->gsr_source.ss_family)) +@@ -1070,7 +1088,9 @@ + { + const struct group_source_req* gsr = optval; + /* verify if existing group/interface pairing */ +- for (unsigned i = 0; i < sock->recv_gsr_len; i++) ++ { ++ unsigned i; ++ for (i = 0; i < sock->recv_gsr_len; i++) + { + if (pgm_sockaddr_cmp ((const struct sockaddr*)&gsr->gsr_group, (struct sockaddr*)&sock->recv_gsr[i].gsr_group) == 0 && + pgm_sockaddr_cmp ((const struct sockaddr*)&gsr->gsr_source, (struct sockaddr*)&sock->recv_gsr[i].gsr_source) == 0 && +@@ -1084,6 +1104,7 @@ + } + } + } ++ } + if (PGM_UNLIKELY(sock->family != gsr->gsr_group.ss_family)) + break; + if (PGM_UNLIKELY(sock->family != gsr->gsr_source.ss_family)) +@@ -1336,52 +1357,78 @@ + if (sock->use_pgmcc && + 0 != pgm_notify_init (&sock->ack_notify)) + { ++#ifdef _MSC_VER ++ char buffer[1024]; ++#endif + const int save_errno = errno; + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_errno (save_errno), + _("Creating ACK notification channel: %s"), +- strerror (save_errno)); ++#ifdef _MSC_VER ++ strerror_s (buffer, sizeof(buffer), save_errno) ++#else ++ strerror (save_errno) ++#endif ++ ); + pgm_rwlock_writer_unlock (&sock->lock); + return FALSE; + } + if (0 != pgm_notify_init (&sock->rdata_notify)) + { ++#ifdef _MSC_VER ++ char buffer[1024]; ++#endif + const int save_errno = errno; + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_errno (save_errno), + _("Creating RDATA notification channel: %s"), +- strerror (save_errno)); ++#ifdef _MSC_VER ++ strerror_s (buffer, sizeof(buffer), save_errno) ++#else ++ strerror (save_errno) ++#endif ++ ); + pgm_rwlock_writer_unlock (&sock->lock); + return FALSE; + } + } + if (0 != pgm_notify_init (&sock->pending_notify)) + { ++#ifdef _MSC_VER ++ char buffer[1024]; ++#endif + const int save_errno = errno; + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_errno (save_errno), + _("Creating waiting peer notification channel: %s"), +- strerror (save_errno)); ++#ifdef _MSC_VER ++ strerror_s (buffer, sizeof(buffer), save_errno) ++#else ++ strerror (save_errno) ++#endif ++ ); + pgm_rwlock_writer_unlock (&sock->lock); + return FALSE; + } + + /* determine IP header size for rate regulation engine & stats */ + sock->iphdr_len = (AF_INET == sock->family) ? sizeof(struct pgm_ip) : sizeof(struct pgm_ip6_hdr); +- pgm_trace (PGM_LOG_ROLE_NETWORK,"Assuming IP header size of %zu bytes", sock->iphdr_len); ++ pgm_trace (PGM_LOG_ROLE_NETWORK,"Assuming IP header size of %lu bytes", sock->iphdr_len); + + if (sock->udp_encap_ucast_port) { + const size_t udphdr_len = sizeof(struct pgm_udphdr); +- pgm_trace (PGM_LOG_ROLE_NETWORK,"Assuming UDP header size of %zu bytes", udphdr_len); ++ pgm_trace (PGM_LOG_ROLE_NETWORK,"Assuming UDP header size of %lu bytes", udphdr_len); + sock->iphdr_len += udphdr_len; + } + ++ { + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + sock->max_tsdu = sock->max_tpdu - sock->iphdr_len - pgm_pkt_offset (FALSE, pgmcc_family); + sock->max_tsdu_fragment = sock->max_tpdu - sock->iphdr_len - pgm_pkt_offset (TRUE, pgmcc_family); ++ { + const unsigned max_fragments = sock->txw_sqns ? MIN( PGM_MAX_FRAGMENTS, sock->txw_sqns ) : PGM_MAX_FRAGMENTS; + sock->max_apdu = MIN( PGM_MAX_APDU, max_fragments * sock->max_tsdu_fragment ); + +@@ -1419,6 +1466,7 @@ + /* Stevens: "SO_REUSEADDR has datatype int." + */ + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Set socket sharing.")); ++ { + const int v = 1; + if (PGM_SOCKET_ERROR == setsockopt (sock->recv_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&v, sizeof(v)) || + PGM_SOCKET_ERROR == setsockopt (sock->send_sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&v, sizeof(v)) || +@@ -1433,10 +1481,12 @@ + pgm_rwlock_writer_unlock (&sock->lock); + return FALSE; + } ++ } + + /* request extra packet information to determine destination address on each packet */ + #ifndef CONFIG_TARGET_WINE + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Request socket packet-info.")); ++ { + const sa_family_t recv_family = sock->family; + if (PGM_SOCKET_ERROR == pgm_sockaddr_pktinfo (sock->recv_sock, recv_family, TRUE)) + { +@@ -1449,6 +1499,7 @@ + pgm_rwlock_writer_unlock (&sock->lock); + return FALSE; + } ++ } + #endif + } + else +@@ -1501,6 +1552,7 @@ + */ + /* TODO: different ports requires a new bound socket */ + ++ { + union { + struct sockaddr sa; + struct sockaddr_in s4; +@@ -1546,6 +1598,7 @@ + { + char addr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&recv_addr, addr, sizeof(addr)); ++ { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, +@@ -1555,6 +1608,7 @@ + pgm_sock_strerror (save_errno)); + pgm_rwlock_writer_unlock (&sock->lock); + return FALSE; ++ } + } + + if (PGM_UNLIKELY(pgm_log_mask & PGM_LOG_ROLE_NETWORK)) +@@ -1590,6 +1644,7 @@ + { + char addr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&send_addr, addr, sizeof(addr)); ++ { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, +@@ -1599,6 +1654,7 @@ + pgm_sock_strerror (save_errno)); + pgm_rwlock_writer_unlock (&sock->lock); + return FALSE; ++ } + } + + /* resolve bound address if 0.0.0.0 */ +@@ -1631,6 +1687,7 @@ + { + char addr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&send_with_router_alert_addr, addr, sizeof(addr)); ++ { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, +@@ -1640,6 +1697,7 @@ + pgm_sock_strerror (save_errno)); + pgm_rwlock_writer_unlock (&sock->lock); + return FALSE; ++ } + } + + if (PGM_UNLIKELY(pgm_log_mask & PGM_LOG_ROLE_NETWORK)) +@@ -1658,7 +1716,7 @@ + /* setup rate control */ + if (sock->txw_max_rte) + { +- pgm_trace (PGM_LOG_ROLE_RATE_CONTROL,_("Setting rate regulation to %zd bytes per second."), ++ pgm_trace (PGM_LOG_ROLE_RATE_CONTROL,_("Setting rate regulation to %ld bytes per second."), + sock->txw_max_rte); + + pgm_rate_create (&sock->rate_control, sock->txw_max_rte, sock->iphdr_len, sock->max_tpdu); +@@ -1684,6 +1742,9 @@ + pgm_rwlock_writer_unlock (&sock->lock); + pgm_debug ("PGM socket successfully bound."); + return TRUE; ++ } ++ } ++ } + } + + bool +@@ -1697,11 +1758,14 @@ + #ifdef CONFIG_TARGET_WINE + pgm_return_val_if_fail (sock->recv_gsr_len == 1, FALSE); + #endif +- for (unsigned i = 0; i < sock->recv_gsr_len; i++) ++ { ++ unsigned i; ++ for (i = 0; i < sock->recv_gsr_len; i++) + { + pgm_return_val_if_fail (sock->recv_gsr[i].gsr_group.ss_family == sock->recv_gsr[0].gsr_group.ss_family, FALSE); + pgm_return_val_if_fail (sock->recv_gsr[i].gsr_group.ss_family == sock->recv_gsr[i].gsr_source.ss_family, FALSE); + } ++ } + pgm_return_val_if_fail (sock->send_gsr.gsr_group.ss_family == sock->recv_gsr[0].gsr_group.ss_family, FALSE); + /* shutdown */ + if (PGM_UNLIKELY(!pgm_rwlock_writer_trylock (&sock->lock))) +@@ -1810,6 +1874,7 @@ + return -1; + } + ++ { + const bool is_congested = (sock->use_pgmcc && sock->tokens < pgm_fp8 (1)) ? TRUE : FALSE; + + if (readfds) +@@ -1826,9 +1891,11 @@ + fds = MAX(fds, ack_fd + 1); + } + } ++ { + const int pending_fd = pgm_notify_get_fd (&sock->pending_notify); + FD_SET(pending_fd, readfds); + fds = MAX(fds, pending_fd + 1); ++ } + } + + if (sock->can_send_data && writefds && !is_congested) +@@ -1838,6 +1905,7 @@ + } + + return *n_fds = MAX(fds, *n_fds); ++ } + } + + #ifdef CONFIG_HAVE_POLL +@@ -1931,6 +1999,7 @@ + return -1; + } + ++ { + struct epoll_event event; + int retval = 0; + +@@ -1988,6 +2057,7 @@ + } + out: + return retval; ++ } + } + #endif + diff --git a/3rdparty/openpgm-svn-r1085/pgm/socket_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/socket_unittest.c index 7f79f06..f4ea446 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/socket_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/socket_unittest.c @@ -93,11 +93,68 @@ generate_asm_sockaddr (void) { const pgm_gsi_t gsi = { 200, 202, 203, 204, 205, 206 }; struct pgm_sockaddr_t* pgmsa = g_new0 (struct pgm_sockaddr_t, 1); - pgmsa->sa_port = 123; + pgmsa->sa_port = TEST_PORT; memcpy (&pgmsa->sa_addr.gsi, &gsi, sizeof(gsi)); return pgmsa; } +/* apply minimum socket options to new socket to pass bind() + */ + +static +void +prebind_socket ( + struct pgm_sock_t* sock + ) +{ + sock->max_tpdu = TEST_MAX_TPDU; + sock->max_tsdu = TEST_MAX_TPDU - sizeof(struct pgm_ip) - pgm_pkt_offset (FALSE, FALSE); + sock->max_tsdu_fragment = TEST_MAX_TPDU - sizeof(struct pgm_ip) - pgm_pkt_offset (TRUE, FALSE); + sock->max_apdu = MIN(TEST_TXW_SQNS, PGM_MAX_FRAGMENTS) * sock->max_tsdu_fragment; + +/* tx */ + sock->can_send_data = TRUE; + sock->spm_ambient_interval = TEST_SPM_AMBIENT; + const guint interval_init[] = TEST_SPM_HEARTBEAT_INIT; + sock->spm_heartbeat_len = sizeof(interval_init) / sizeof(interval_init[0]); + sock->spm_heartbeat_interval = g_new0 (guint, sock->spm_heartbeat_len + 1); + for (guint i = 1; i < sock->spm_heartbeat_len; i++) + sock->spm_heartbeat_interval[i] = interval_init[i]; + sock->txw_sqns = TEST_TXW_SQNS; + +/* rx */ + sock->can_recv_data = TRUE; + sock->rxw_sqns = TEST_RXW_SQNS; + sock->peer_expiry = TEST_PEER_EXPIRY; + sock->spmr_expiry = TEST_SPMR_EXPIRY; + sock->nak_bo_ivl = TEST_NAK_BO_IVL; + sock->nak_rpt_ivl = TEST_NAK_RPT_IVL; + sock->nak_rdata_ivl = TEST_NAK_RDATA_IVL; + sock->nak_data_retries = TEST_NAK_DATA_RETRIES; + sock->nak_ncf_retries = TEST_NAK_NCF_RETRIES; +} + +/* apply minimum sockets options to pass connect() + */ + +static +void +preconnect_socket ( + struct pgm_sock_t* sock + ) +{ +/* tx */ + ((struct sockaddr*)&sock->send_gsr.gsr_group)->sa_family = AF_INET; + ((struct sockaddr_in*)&sock->send_gsr.gsr_group)->sin_addr.s_addr = inet_addr ("239.192.0.1"); + +/* rx */ + sock->recv_gsr_len = 1; + ((struct sockaddr*)&sock->recv_gsr[0].gsr_group)->sa_family = ((struct sockaddr*)&sock->send_gsr.gsr_group)->sa_family; + ((struct sockaddr*)&sock->recv_gsr[0].gsr_source)->sa_family = ((struct sockaddr*)&sock->send_gsr.gsr_group)->sa_family; + ((struct sockaddr_in*)&sock->recv_gsr[0].gsr_group)->sin_addr.s_addr = ((struct sockaddr_in*)&sock->send_gsr.gsr_group)->sin_addr.s_addr; + ((struct sockaddr_in*)&sock->recv_gsr[0].gsr_source)->sin_addr.s_addr = ((struct sockaddr_in*)&sock->send_gsr.gsr_group)->sin_addr.s_addr; +} + /* stock create unconnected socket for pgm_setsockopt(), etc. */ @@ -105,23 +162,20 @@ static struct pgm_sock_t* generate_sock (void) { - const pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, g_htons(1000) }; + const pgm_tsi_t tsi = { { 1, 2, 3, 4, 5, 6 }, g_htons(TEST_PORT) }; struct pgm_sock_t* sock = g_new0 (struct pgm_sock_t, 1); - memcpy (&sock->tsi, &tsi, sizeof(pgm_tsi_t)); + sock->family = AF_INET; + sock->protocol = IPPROTO_IP; + sock->recv_sock = socket (AF_INET, SOCK_RAW, 113); + sock->send_sock = socket (AF_INET, SOCK_RAW, 113); + sock->send_with_router_alert_sock = socket (AF_INET, SOCK_RAW, 113); ((struct sockaddr*)&sock->send_addr)->sa_family = AF_INET; ((struct sockaddr_in*)&sock->send_addr)->sin_addr.s_addr = inet_addr ("127.0.0.2"); - ((struct sockaddr*)&sock->send_gsr.gsr_group)->sa_family = AF_INET; - ((struct sockaddr_in*)&sock->send_gsr.gsr_group)->sin_addr.s_addr = inet_addr ("239.192.0.1"); + memcpy (&sock->tsi, &tsi, sizeof(pgm_tsi_t)); sock->dport = g_htons(TEST_PORT); - sock->window = g_malloc0 (sizeof(pgm_txw_t)); - sock->txw_sqns = TEST_TXW_SQNS; - sock->max_tpdu = TEST_MAX_TPDU; - sock->max_tsdu = TEST_MAX_TPDU - sizeof(struct pgm_ip) - pgm_pkt_offset (FALSE, FALSE); - sock->max_tsdu_fragment = TEST_MAX_TPDU - sizeof(struct pgm_ip) - pgm_pkt_offset (TRUE, FALSE); - sock->max_apdu = MIN(TEST_TXW_SQNS, PGM_MAX_FRAGMENTS) * sock->max_tsdu_fragment; + sock->window = g_new0 (pgm_txw_t, 1); sock->iphdr_len = sizeof(struct pgm_ip); - sock->spm_heartbeat_interval = g_malloc0 (sizeof(guint) * (2+2)); - sock->spm_heartbeat_interval[0] = pgm_secs(1); + pgm_rwlock_init (&sock->lock); pgm_spinlock_init (&sock->txw_spinlock); sock->is_bound = FALSE; sock->is_connected = FALSE; @@ -455,7 +509,9 @@ START_TEST (test_connect_pass_001) fail_if (NULL == pgmsa, "generate_asm_sockaddr failed"); fail_unless (TRUE == pgm_socket (&sock, AF_INET, SOCK_SEQPACKET, IPPROTO_PGM, &err), "create failed"); fail_unless (NULL == err, "error raised"); + prebind_socket (sock); fail_unless (TRUE == pgm_bind (sock, pgmsa, sizeof(*pgmsa), &err), "bind failed"); + preconnect_socket (sock); fail_unless (TRUE == pgm_connect (sock, &err), "connect failed"); } END_TEST @@ -526,6 +582,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_MAX_TPDU, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -536,22 +593,24 @@ START_TEST (test_set_max_tpdu_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_MTU; const int max_tpdu = 1500; const void* optval = &max_tpdu; const socklen_t optlen = sizeof(max_tpdu); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_max_tpdu failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_max_tpdu failed"); } END_TEST /* invalid parameters */ START_TEST (test_set_max_tpdu_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_MTU; const int max_tpdu = 1500; const void* optval = &max_tpdu; const socklen_t optlen = sizeof(max_tpdu); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_max_tpdu failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_max_tpdu failed"); } END_TEST @@ -560,11 +619,12 @@ START_TEST (test_set_max_tpdu_fail_002) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_MTU; const int max_tpdu = 1; const void* optval = &max_tpdu; const socklen_t optlen = sizeof(max_tpdu); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_max_tpdu failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_max_tpdu failed"); } END_TEST @@ -572,6 +632,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_MULTICAST_LOOP, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -582,21 +643,23 @@ START_TEST (test_set_multicast_loop_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_MULTICAST_LOOP; const int loop_enabled = 1; const void* optval = &loop_enabled; const socklen_t optlen = sizeof(loop_enabled); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_multicast_loop failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_multicast_loop failed"); } END_TEST START_TEST (test_set_multicast_loop_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_MULTICAST_LOOP; const int loop_enabled = 1; const void* optval = &loop_enabled; const socklen_t optlen = sizeof(loop_enabled); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_multicast_loop failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_multicast_loop failed"); } END_TEST @@ -604,6 +667,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_MULTICAST_HOPS, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -614,21 +678,23 @@ START_TEST (test_set_hops_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_MULTICAST_HOPS; const int hops = 16; const void* optval = &hops; const socklen_t optlen = sizeof(hops); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_hops failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_hops failed"); } END_TEST START_TEST (test_set_hops_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_MULTICAST_HOPS; const int hops = 16; const void* optval = &hops; const socklen_t optlen = sizeof(hops); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_hops failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_hops failed"); } END_TEST @@ -636,7 +702,8 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, - * const int optname = PGM_SNDBUF, + * const int level = SOL_SOCKET, + * const int optname = SO_SNDBUF, * const void* optval, * const socklen_t optlen = sizeof(int) * ) @@ -646,21 +713,23 @@ START_TEST (test_set_sndbuf_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); - const int optname = PGM_SNDBUF; + const int level = SOL_SOCKET; + const int optname = SO_SNDBUF; const int bufsize = 131071; /* 128kB */ const void* optval = &bufsize; const socklen_t optlen = sizeof(bufsize); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_sndbuf failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_sndbuf failed"); } END_TEST START_TEST (test_set_sndbuf_fail_001) { - const int optname = PGM_SNDBUF; + const int level = SOL_SOCKET; + const int optname = SO_SNDBUF; const int bufsize = 131071; /* 128kB */ const void* optval = &bufsize; const socklen_t optlen = sizeof(bufsize); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_sndbuf failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_sndbuf failed"); } END_TEST @@ -668,6 +737,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = SOL_SOCKET, * const int optname = PGM_RCVBUF, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -678,21 +748,23 @@ START_TEST (test_set_rcvbuf_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); - const int optname = PGM_RCVBUF; + const int level = SOL_SOCKET; + const int optname = SO_RCVBUF; const int bufsize = 131071; /* 128kB */ const void* optval = &bufsize; const socklen_t optlen = sizeof(bufsize); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_rcvbuf failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_rcvbuf failed"); } END_TEST START_TEST (test_set_rcvbuf_fail_001) { - const int optname = PGM_RCVBUF; + const int level = SOL_SOCKET; + const int optname = SO_RCVBUF; const int bufsize = 131071; /* 128kB */ const void* optval = &bufsize; const socklen_t optlen = sizeof(bufsize); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_rcvbuf failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_rcvbuf failed"); } END_TEST @@ -700,6 +772,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_USE_FEC, * const void* optval, * const socklen_t optlen = sizeof(struct pgm_fecinfo_t) @@ -710,33 +783,35 @@ START_TEST (test_set_fec_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_USE_FEC; const struct pgm_fecinfo_t fecinfo = { .ondemand_parity_enabled = TRUE, .proactive_packets = 16, .var_pktlen_enabled = TRUE, .block_size = 255, - .group_size = 239 + .group_size = 64 }; const void* optval = &fecinfo; const socklen_t optlen = sizeof(fecinfo); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_fec failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_fec failed"); } END_TEST START_TEST (test_set_fec_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_USE_FEC; const struct pgm_fecinfo_t fecinfo = { .ondemand_parity_enabled = TRUE, .proactive_packets = 16, .var_pktlen_enabled = TRUE, .block_size = 255, - .group_size = 239 + .group_size = 64 }; const void* optval = &fecinfo; const socklen_t optlen = sizeof(fecinfo); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_fec failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_fec failed"); } END_TEST @@ -747,6 +822,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_USE_PGMCC, * const void* optval, * const socklen_t optlen = sizeof(struct pgm_pgmccinfo_t) @@ -757,6 +833,7 @@ START_TEST (test_set_pgmcc_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_USE_PGMCC; const struct pgm_pgmccinfo_t pgmccinfo = { .ack_bo_ivl = pgm_msecs(100), @@ -765,12 +842,13 @@ START_TEST (test_set_pgmcc_pass_001) }; const void* optval = &pgmccinfo; const socklen_t optlen = sizeof(pgmccinfo); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_pgmcc failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_pgmcc failed"); } END_TEST START_TEST (test_set_pgmcc_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_USE_PGMCC; const struct pgm_pgmccinfo_t pgmccinfo = { .ack_bo_ivl = pgm_msecs(100), @@ -779,7 +857,7 @@ START_TEST (test_set_pgmcc_fail_001) }; const void* optval = &pgmccinfo; const socklen_t optlen = sizeof(pgmccinfo); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_pgmcc failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_pgmcc failed"); } END_TEST @@ -787,6 +865,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_USE_CR, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -797,21 +876,23 @@ START_TEST (test_set_cr_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_USE_CR; const int magic_bunny = 1; const void* optval = &magic_bunny; const socklen_t optlen = sizeof(magic_bunny); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_cr failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_cr failed"); } END_TEST START_TEST (test_set_cr_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_USE_CR; const int magic_bunny = 1; const void* optval = &magic_bunny; const socklen_t optlen = sizeof(magic_bunny); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_cr failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_cr failed"); } END_TEST @@ -820,6 +901,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_SEND_ONLY, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -830,21 +912,23 @@ START_TEST (test_set_send_only_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_SEND_ONLY; const int send_only = 1; const void* optval = &send_only; const socklen_t optlen = sizeof(send_only); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_send_only failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_send_only failed"); } END_TEST START_TEST (test_set_send_only_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_SEND_ONLY; const int send_only = 1; const void* optval = &send_only; const socklen_t optlen = sizeof(send_only); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_send_only failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_send_only failed"); } END_TEST @@ -852,6 +936,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_RECV_ONLY, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -862,21 +947,23 @@ START_TEST (test_set_recv_only_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_RECV_ONLY; const int recv_only = 1; const void* optval = &recv_only; const socklen_t optlen = sizeof(recv_only); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_recv_only failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_recv_only failed"); } END_TEST START_TEST (test_set_recv_only_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_RECV_ONLY; const int recv_only = 1; const void* optval = &recv_only; const socklen_t optlen = sizeof(recv_only); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_recv_only failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_recv_only failed"); } END_TEST @@ -884,6 +971,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_PASSIVE, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -894,21 +982,23 @@ START_TEST (test_set_recv_only_pass_002) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_PASSIVE; const int passive = 1; const void* optval = &passive; const socklen_t optlen = sizeof(passive); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_passive failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_passive failed"); } END_TEST START_TEST (test_set_recv_only_fail_002) { + const int level = IPPROTO_PGM; const int optname = PGM_PASSIVE; const int passive = 1; const void* optval = &passive; const socklen_t optlen = sizeof(passive); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_passive failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_passive failed"); } END_TEST @@ -916,6 +1006,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_ABORT_ON_RESET, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -926,21 +1017,23 @@ START_TEST (test_set_abort_on_reset_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_ABORT_ON_RESET; const int abort_on_reset= 1; const void* optval = &abort_on_reset; const socklen_t optlen = sizeof(abort_on_reset); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_abort_on_reset failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_abort_on_reset failed"); } END_TEST START_TEST (test_set_abort_on_reset_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_ABORT_ON_RESET; const int abort_on_reset= 1; const void* optval = &abort_on_reset; const socklen_t optlen = sizeof(abort_on_reset); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_abort_on_reset failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_abort_on_reset failed"); } END_TEST @@ -948,6 +1041,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_NOBLOCK, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -958,21 +1052,23 @@ START_TEST (test_set_noblock_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_NOBLOCK; const int noblock = 1; const void* optval = &noblock; const socklen_t optlen = sizeof(noblock); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_noblock failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_noblock failed"); } END_TEST START_TEST (test_set_noblock_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_NOBLOCK; const int noblock = 1; const void* optval = &noblock; const socklen_t optlen = sizeof(noblock); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_noblock failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_noblock failed"); } END_TEST @@ -980,6 +1076,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_UDP_ENCAP_UCAST_PORT, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -990,21 +1087,23 @@ START_TEST (test_set_udp_unicast_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_NOBLOCK; const int unicast_port = 10001; const void* optval = &unicast_port; const socklen_t optlen = sizeof(unicast_port); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_udp_unicast failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_udp_unicast failed"); } END_TEST START_TEST (test_set_udp_unicast_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_NOBLOCK; const int unicast_port = 10001; const void* optval = &unicast_port; const socklen_t optlen = sizeof(unicast_port); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_udp_unicast failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_udp_unicast failed"); } END_TEST @@ -1012,6 +1111,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_UDP_ENCAP_MCAST_PORT, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -1022,21 +1122,23 @@ START_TEST (test_set_udp_multicast_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_NOBLOCK; const int multicast_port= 10001; const void* optval = &multicast_port; const socklen_t optlen = sizeof(multicast_port); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_udp_multicast failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_udp_multicast failed"); } END_TEST START_TEST (test_set_udp_multicast_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_NOBLOCK; const int multicast_port= 10002; const void* optval = &multicast_port; const socklen_t optlen = sizeof(multicast_port); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_udp_multicast failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_udp_multicast failed"); } END_TEST @@ -1175,6 +1277,11 @@ make_master_suite (void) int main (void) { + if (0 != getuid()) { + fprintf (stderr, "This test requires super-user privileges to run.\n"); + return EXIT_FAILURE; + } + SRunner* sr = srunner_create (make_master_suite ()); srunner_add_suite (sr, make_test_suite ()); srunner_run_all (sr, CK_ENV); diff --git a/3rdparty/openpgm-svn-r1085/pgm/source.c b/3rdparty/openpgm-svn-r1135/pgm/source.c index 12a61b6..bea0f33 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/source.c +++ b/3rdparty/openpgm-svn-r1135/pgm/source.c @@ -20,7 +20,11 @@ */ #define __STDC_FORMAT_MACROS -#include <inttypes.h> +#ifdef _MSC_VER +# include <pgm/wininttypes.h> +#else +# include <inttypes.h> +#endif #include <errno.h> #include <impl/i18n.h> #include <impl/framework.h> @@ -47,11 +51,11 @@ static inline bool peer_is_source (const pgm_peer_t*) PGM_GNUC_CONST; static inline bool peer_is_peer (const pgm_peer_t*) PGM_GNUC_CONST; static void reset_heartbeat_spm (pgm_sock_t*const, const pgm_time_t); static bool send_ncf (pgm_sock_t*const restrict, const struct sockaddr*const restrict, const struct sockaddr*const restrict, const uint32_t, const bool); -static bool send_ncf_list (pgm_sock_t*const restrict, const struct sockaddr*const restrict, const struct sockaddr*restrict, struct pgm_sqn_list_t*const restrict, const bool); +static bool send_ncf_list (pgm_sock_t*const restrict, const struct sockaddr*const restrict, const struct sockaddr*const restrict, struct pgm_sqn_list_t*const restrict, const bool); static int send_odata (pgm_sock_t*const restrict, struct pgm_sk_buff_t*const restrict, size_t*restrict); static int send_odata_copy (pgm_sock_t*const restrict, const void*restrict, const uint16_t, size_t*restrict); static int send_odatav (pgm_sock_t*const restrict, const struct pgm_iovec*const restrict, const unsigned, size_t*restrict); -static bool send_rdata (pgm_sock_t*const restrict, struct pgm_sk_buff_t*const restrict); +static bool send_rdata (pgm_sock_t*restrict, struct pgm_sk_buff_t*restrict); static inline @@ -971,7 +975,7 @@ send_ncf_list ( static void reset_heartbeat_spm ( - pgm_sock_t* sock, + pgm_sock_t*const sock, const pgm_time_t now ) { @@ -1225,7 +1229,8 @@ send_odata_copy ( sizeof(struct pgm_opt6_pgmcc_data) : sizeof(struct pgm_opt_pgmcc_data)); struct pgm_opt_pgmcc_data* pgmcc_data = (struct pgm_opt_pgmcc_data*)(opt_header + 1); - struct pgm_opt6_pgmcc_data* pgmcc_data6 = (struct pgm_opt6_pgmcc_data*)(opt_header + 1); +/* unused */ +// struct pgm_opt6_pgmcc_data* pgmcc_data6 = (struct pgm_opt6_pgmcc_data*)(opt_header + 1); pgmcc_data->opt_reserved = 0; pgmcc_data->opt_tstamp = htonl (pgm_to_msecs (STATE(skb)->tstamp)); @@ -2290,17 +2295,17 @@ send_rdata ( header->pgm_checksum = 0; const size_t pgm_header_len = tpdu_length - ntohs(header->pgm_tsdu_length); uint32_t unfolded_header = pgm_csum_partial (header, pgm_header_len, 0); - uint32_t unfolded_odata = pgm_txw_get_unfolded_checksum (skb); + uint32_t unfolded_odata = pgm_csum_partial (skb->data, ntohs(header->pgm_tsdu_length), 0); header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, unfolded_odata, pgm_header_len)); /* congestion control */ - if (sock->use_pgmcc && - sock->tokens < pgm_fp8 (1)) - { +// if (sock->use_pgmcc && +// sock->tokens < pgm_fp8 (1)) +// { // pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("Token limit reached.")); - sock->blocklen = tpdu_length; - return FALSE; - } +// sock->blocklen = tpdu_length; +// return FALSE; +// } const ssize_t sent = pgm_sendto (sock, sock->is_controlled_rdata, /* rate limited */ @@ -2318,7 +2323,8 @@ send_rdata ( const pgm_time_t now = pgm_time_update_now(); if (sock->use_pgmcc) { - sock->tokens -= pgm_fp8 (1); + if (sock->tokens >= pgm_fp8 (1)) + sock->tokens -= pgm_fp8 (1); sock->ack_expiry = now + sock->ack_expiry_ivl; } diff --git a/3rdparty/openpgm-svn-r1135/pgm/source.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/source.c.c89.patch new file mode 100644 index 0000000..dce59e9 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/source.c.c89.patch @@ -0,0 +1,1021 @@ +--- source.c 2010-08-05 11:41:13.000000000 +0800 ++++ source.c89 2010-08-05 11:41:04.000000000 +0800 +@@ -124,11 +124,13 @@ + ) + { + pgm_return_val_if_fail (NULL != sock, FALSE); ++ { + const bool status = pgm_txw_retransmit_push (sock->window, + nak_tg_sqn | sock->rs_proactive_h, + TRUE /* is_parity */, + sock->tg_sqn_shift); + return status; ++ } + } + + /* a deferred request for RDATA, now processing in the timer thread, we check the transmit +@@ -159,6 +161,7 @@ + * has been retransmitted. + */ + pgm_spinlock_lock (&sock->txw_spinlock); ++ { + struct pgm_sk_buff_t* skb = pgm_txw_retransmit_try_peek (sock->window); + if (skb) { + skb = pgm_skb_get (skb); +@@ -174,6 +177,7 @@ + } else + pgm_spinlock_unlock (&sock->txw_spinlock); + return TRUE; ++ } + } + + /* SPMR indicates if multicast to cancel own SPMR, or unicast to send SPM. +@@ -233,10 +237,11 @@ + pgm_assert (NULL != skb); + pgm_assert (NULL != opt_pgmcc_feedback); + ++ { + const uint32_t opt_tstamp = ntohl (opt_pgmcc_feedback->opt_tstamp); + const uint16_t opt_loss_rate = ntohs (opt_pgmcc_feedback->opt_loss_rate); + +- const uint32_t rtt = pgm_to_msecs (skb->tstamp) - opt_tstamp; ++ const uint32_t rtt = (uint32_t)(pgm_to_msecs (skb->tstamp) - opt_tstamp); + const uint64_t peer_loss = rtt * rtt * opt_loss_rate; + + struct sockaddr_storage peer_nla; +@@ -263,6 +268,7 @@ + } + + return FALSE; ++ } + } + + /* NAK requesting RDATA transmission for a sending sock, only valid if +@@ -290,6 +296,7 @@ + pgm_debug ("pgm_on_nak (sock:%p skb:%p)", + (const void*)sock, (const void*)skb); + ++ { + const bool is_parity = skb->pgm_header->pgm_options & PGM_OPT_PARITY; + if (is_parity) { + sock->cumulative_stats[PGM_PC_SOURCE_PARITY_NAKS_RECEIVED]++; +@@ -307,6 +314,7 @@ + return FALSE; + } + ++ { + const struct pgm_nak* nak = (struct pgm_nak*) skb->data; + const struct pgm_nak6* nak6 = (struct pgm_nak6*)skb->data; + +@@ -323,6 +331,7 @@ + } + + /* NAK_GRP_NLA containers our sock multicast group */ ++ { + struct sockaddr_storage nak_grp_nla; + pgm_nla_to_sockaddr ((AF_INET6 == nak_src_nla.ss_family) ? &nak6->nak6_grp_nla_afi : &nak->nak_grp_nla_afi, (struct sockaddr*)&nak_grp_nla); + if (PGM_UNLIKELY(pgm_sockaddr_cmp ((struct sockaddr*)&nak_grp_nla, (struct sockaddr*)&sock->send_gsr.gsr_group) != 0)) +@@ -335,6 +344,7 @@ + } + + /* create queue object */ ++ { + struct pgm_sqn_list_t sqn_list; + sqn_list.sqn[0] = ntohl (nak->nak_sqn); + sqn_list.len = 1; +@@ -342,6 +352,7 @@ + pgm_debug ("nak_sqn %" PRIu32, sqn_list.sqn[0]); + + /* check NAK list */ ++ { + const uint32_t* nak_list = NULL; + uint_fast8_t nak_list_len = 0; + if (skb->pgm_header->pgm_options & PGM_OPT_PRESENT) +@@ -360,6 +371,7 @@ + return FALSE; + } + /* TODO: check for > 16 options & past packet end */ ++ { + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)opt_len; + do { + opt_header = (const struct pgm_opt_header*)((const char*)opt_header + opt_header->opt_length); +@@ -369,6 +381,7 @@ + break; + } + } while (!(opt_header->opt_type & PGM_OPT_END)); ++ } + } + + /* nak list numbers */ +@@ -376,12 +389,15 @@ + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Malformed NAK rejected on too long sequence list.")); + return FALSE; + } +- +- for (uint_fast8_t i = 0; i < nak_list_len; i++) ++ ++ { ++ uint_fast8_t i; ++ for (i = 0; i < nak_list_len; i++) + { + sqn_list.sqn[sqn_list.len++] = ntohl (*nak_list); + nak_list++; + } ++ } + + /* send NAK confirm packet immediately, then defer to timer thread for a.s.a.p + * delivery of the actual RDATA packets. blocking send for NCF is ignored as RDATA +@@ -393,13 +409,21 @@ + send_ncf (sock, (struct sockaddr*)&nak_src_nla, (struct sockaddr*)&nak_grp_nla, sqn_list.sqn[0], is_parity); + + /* queue retransmit requests */ +- for (uint_fast8_t i = 0; i < sqn_list.len; i++) { ++ { ++ uint_fast8_t i; ++ for (i = 0; i < sqn_list.len; i++) { + const bool push_status = pgm_txw_retransmit_push (sock->window, sqn_list.sqn[i], is_parity, sock->tg_sqn_shift); + if (PGM_UNLIKELY(!push_status)) { + pgm_trace (PGM_LOG_ROLE_TX_WINDOW,_("Failed to push retransmit request for #%" PRIu32), sqn_list.sqn[i]); + } + } ++ } + return TRUE; ++ } ++ } ++ } ++ } ++ } + } + + /* Null-NAK, or N-NAK propogated by a DLR for hand waving excitement +@@ -427,6 +451,7 @@ + return FALSE; + } + ++ { + const struct pgm_nak* nnak = (struct pgm_nak*) skb->data; + const struct pgm_nak6* nnak6 = (struct pgm_nak6*)skb->data; + +@@ -441,6 +466,7 @@ + } + + /* NAK_GRP_NLA containers our sock multicast group */ ++ { + struct sockaddr_storage nnak_grp_nla; + pgm_nla_to_sockaddr ((AF_INET6 == nnak_src_nla.ss_family) ? &nnak6->nak6_grp_nla_afi : &nnak->nak_grp_nla_afi, (struct sockaddr*)&nnak_grp_nla); + if (PGM_UNLIKELY(pgm_sockaddr_cmp ((struct sockaddr*)&nnak_grp_nla, (struct sockaddr*)&sock->send_gsr.gsr_group) != 0)) +@@ -450,6 +476,7 @@ + } + + /* check NNAK list */ ++ { + uint_fast8_t nnak_list_len = 0; + if (skb->pgm_header->pgm_options & PGM_OPT_PRESENT) + { +@@ -465,6 +492,7 @@ + return FALSE; + } + /* TODO: check for > 16 options & past packet end */ ++ { + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)opt_len; + do { + opt_header = (const struct pgm_opt_header*)((const char*)opt_header + opt_header->opt_length); +@@ -473,10 +501,14 @@ + break; + } + } while (!(opt_header->opt_type & PGM_OPT_END)); ++ } + } + + sock->cumulative_stats[PGM_PC_SOURCE_SELECTIVE_NNAKS_RECEIVED] += 1 + nnak_list_len; + return TRUE; ++ } ++ } ++ } + } + + /* ACK, sent upstream by one selected ACKER for congestion control feedback. +@@ -507,6 +539,7 @@ + if (!sock->use_pgmcc) + return FALSE; + ++ { + const struct pgm_ack* ack = (struct pgm_ack*)skb->data; + bool is_acker = FALSE; + +@@ -522,6 +555,7 @@ + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Malformed ACK rejected.")); + return FALSE; + } ++ { + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)opt_len; + do { + opt_header = (const struct pgm_opt_header*)((const char*)opt_header + opt_header->opt_length); +@@ -531,6 +565,7 @@ + break; /* ignore other options */ + } + } while (!(opt_header->opt_type & PGM_OPT_END)); ++ } + } + + /* ignore ACKs from other receivers or sessions */ +@@ -541,22 +576,26 @@ + sock->next_crqst = 0; + + /* count new ACK sequences */ ++ { + const uint32_t ack_rx_max = ntohl (ack->ack_rx_max); + const int32_t delta = ack_rx_max - sock->ack_rx_max; + /* ignore older ACKs when multiple active ACKers */ + if (pgm_uint32_gt (ack_rx_max, sock->ack_rx_max)) + sock->ack_rx_max = ack_rx_max; ++ { + uint32_t ack_bitmap = ntohl (ack->ack_bitmap); + if (delta > 32) sock->ack_bitmap = 0; /* sequence jump ahead beyond past bitmap */ + else if (delta > 0) sock->ack_bitmap <<= delta; /* immediate sequence */ + else if (delta > -32) ack_bitmap <<= -delta; /* repair sequence scoped by bitmap */ + else ack_bitmap = 0; /* old sequence */ ++ { + unsigned new_acks = _pgm_popcount (ack_bitmap & ~sock->ack_bitmap); + sock->ack_bitmap |= ack_bitmap; + + if (0 == new_acks) + return TRUE; + ++ { + const bool is_congestion_limited = (sock->tokens < pgm_fp8 (1)); + + /* after loss detection cancel any further manipulation of the window +@@ -568,14 +607,17 @@ + { + pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("PGMCC window token manipulation suspended due to congestion (T:%u W:%u)"), + pgm_fp8tou (sock->tokens), pgm_fp8tou (sock->cwnd_size)); ++ { + const uint_fast32_t token_inc = pgm_fp8mul (pgm_fp8 (new_acks), pgm_fp8 (1) + pgm_fp8div (pgm_fp8 (1), sock->cwnd_size)); + sock->tokens = MIN( sock->tokens + token_inc, sock->cwnd_size ); ++ } + goto notify_tx; + } + sock->is_congested = FALSE; + } + + /* count outstanding lost sequences */ ++ { + const unsigned total_lost = _pgm_popcount (~sock->ack_bitmap); + + /* no detected data loss at ACKer, increase congestion window size */ +@@ -583,6 +625,7 @@ + { + new_acks += sock->acks_after_loss; + sock->acks_after_loss = 0; ++ { + uint_fast32_t n = pgm_fp8 (new_acks); + uint_fast32_t token_inc = 0; + +@@ -594,6 +637,7 @@ + sock->cwnd_size += d; + } + ++ { + const uint_fast32_t iw = pgm_fp8div (pgm_fp8 (1), sock->cwnd_size); + + /* linear window increase */ +@@ -602,6 +646,8 @@ + sock->tokens = MIN( sock->tokens + token_inc, sock->cwnd_size ); + // pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("PGMCC++ (T:%u W:%u)"), + // pgm_fp8tou (sock->tokens), pgm_fp8tou (sock->cwnd_size)); ++ } ++ } + } + else + { +@@ -636,6 +682,12 @@ + pgm_notify_send (&sock->ack_notify); + } + return TRUE; ++ } ++ } ++ } ++ } ++ } ++ } + } + + /* ambient/heartbeat SPM's +@@ -658,6 +710,7 @@ + pgm_debug ("pgm_send_spm (sock:%p flags:%d)", + (const void*)sock, flags); + ++ { + size_t tpdu_length = sizeof(struct pgm_header); + if (AF_INET == sock->send_gsr.gsr_group.ss_family) + tpdu_length += sizeof(struct pgm_spm); +@@ -683,9 +736,11 @@ + tpdu_length += sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fin); + } +- char buf[ tpdu_length ]; ++ { ++ char* buf = pgm_newa (char, tpdu_length); + if (PGM_UNLIKELY(pgm_mem_gc_friendly)) + memset (buf, 0, tpdu_length); ++ { + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_spm* spm = (struct pgm_spm *)(header + 1); + struct pgm_spm6* spm6 = (struct pgm_spm6*)(header + 1); +@@ -734,12 +789,14 @@ + sizeof(struct pgm_opt_parity_prm); + opt_header->opt_type = PGM_OPT_PARITY_PRM; + opt_header->opt_length = sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_parity_prm); ++ { + struct pgm_opt_parity_prm* opt_parity_prm = (struct pgm_opt_parity_prm*)(opt_header + 1); + opt_parity_prm->opt_reserved = (sock->use_proactive_parity ? PGM_PARITY_PRM_PRO : 0) | + (sock->use_ondemand_parity ? PGM_PARITY_PRM_OND : 0); + opt_parity_prm->parity_prm_tgs = htonl (sock->rs_k); + last_opt_header = opt_header; + opt_header = (struct pgm_opt_header*)(opt_parity_prm + 1); ++ } + } + + /* OPT_CRQST */ +@@ -750,12 +807,14 @@ + sizeof(struct pgm_opt_crqst); + opt_header->opt_type = PGM_OPT_CRQST; + opt_header->opt_length = sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_crqst); ++ { + struct pgm_opt_crqst* opt_crqst = (struct pgm_opt_crqst*)(opt_header + 1); + /* request receiver worst path report, OPT_CR_RX_WP */ + opt_crqst->opt_reserved = PGM_OPT_CRQST_RXP; + sock->is_pending_crqst = FALSE; + last_opt_header = opt_header; + opt_header = (struct pgm_opt_header*)(opt_crqst + 1); ++ } + } + + /* OPT_FIN */ +@@ -765,10 +824,12 @@ + sizeof(struct pgm_opt_fin); + opt_header->opt_type = PGM_OPT_FIN; + opt_header->opt_length = sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_fin); ++ { + struct pgm_opt_fin* opt_fin = (struct pgm_opt_fin*)(opt_header + 1); + opt_fin->opt_reserved = 0; + last_opt_header = opt_header; + opt_header = (struct pgm_opt_header*)(opt_fin + 1); ++ } + } + + last_opt_header->opt_type |= PGM_OPT_END; +@@ -779,6 +840,7 @@ + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + ++ { + const ssize_t sent = pgm_sendto (sock, + flags != PGM_OPT_SYN && sock->is_controlled_spm, /* rate limited */ + TRUE, /* with router alert */ +@@ -794,6 +856,10 @@ + sock->spm_sqn++; + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length); + return TRUE; ++ } ++ } ++ } ++ } + } + + /* send a NAK confirm (NCF) message with provided sequence number list. +@@ -818,6 +884,7 @@ + pgm_assert (nak_src_nla->sa_family == nak_grp_nla->sa_family); + + #ifdef SOURCE_DEBUG ++ { + char saddr[INET6_ADDRSTRLEN], gaddr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop (nak_src_nla, saddr, sizeof(saddr)); + pgm_sockaddr_ntop (nak_grp_nla, gaddr, sizeof(gaddr)); +@@ -828,11 +895,14 @@ + sequence, + is_parity ? "TRUE": "FALSE" + ); ++ } + #endif + ++ { + size_t tpdu_length = sizeof(struct pgm_header); + tpdu_length += (AF_INET == nak_src_nla->sa_family) ? sizeof(struct pgm_nak) : sizeof(struct pgm_nak6); +- char buf[ tpdu_length ]; ++ { ++ char* buf = pgm_newa (char, tpdu_length); + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_nak* ncf = (struct pgm_nak *)(header + 1); + struct pgm_nak6* ncf6 = (struct pgm_nak6*)(header + 1); +@@ -854,6 +924,7 @@ + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + ++ { + const ssize_t sent = pgm_sendto (sock, + FALSE, /* not rate limited */ + TRUE, /* with router alert */ +@@ -865,6 +936,9 @@ + return FALSE; + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length); + return TRUE; ++ } ++ } ++ } + } + + /* A NCF packet with a OPT_NAK_LIST option extension +@@ -891,16 +965,20 @@ + pgm_assert (nak_src_nla->sa_family == nak_grp_nla->sa_family); + + #ifdef SOURCE_DEBUG ++ { + char saddr[INET6_ADDRSTRLEN], gaddr[INET6_ADDRSTRLEN]; + char list[1024]; + pgm_sockaddr_ntop (nak_src_nla, saddr, sizeof(saddr)); + pgm_sockaddr_ntop (nak_grp_nla, gaddr, sizeof(gaddr)); + sprintf (list, "%" PRIu32, sqn_list->sqn[0]); +- for (uint_fast8_t i = 1; i < sqn_list->len; i++) { ++ { ++ uint_fast8_t i; ++ for (i = 1; i < sqn_list->len; i++) { + char sequence[ 2 + strlen("4294967295") ]; + sprintf (sequence, " %" PRIu32, sqn_list->sqn[i]); + strcat (list, sequence); + } ++ } + pgm_debug ("send_ncf_list (sock:%p nak-src-nla:%s nak-grp-nla:%s sqn-list:[%s] is-parity:%s)", + (void*)sock, + saddr, +@@ -908,14 +986,17 @@ + list, + is_parity ? "TRUE": "FALSE" + ); ++ } + #endif + ++ { + size_t tpdu_length = sizeof(struct pgm_header) + + sizeof(struct pgm_opt_length) + /* includes header */ + sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_nak_list) + + ( (sqn_list->len-1) * sizeof(uint32_t) ); + tpdu_length += (AF_INET == nak_src_nla->sa_family) ? sizeof(struct pgm_nak) : sizeof(struct pgm_nak6); +- char buf[ tpdu_length ]; ++ { ++ char* buf = pgm_newa (char, tpdu_length); + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_nak* ncf = (struct pgm_nak *)(header + 1); + struct pgm_nak6* ncf6 = (struct pgm_nak6*)(header + 1); +@@ -935,6 +1016,7 @@ + pgm_sockaddr_to_nla (nak_grp_nla, (AF_INET6 == nak_src_nla->sa_family) ? (char*)&ncf6->nak6_grp_nla_afi : (char*)&ncf->nak_grp_nla_afi ); + + /* OPT_NAK_LIST */ ++ { + struct pgm_opt_length* opt_len = (AF_INET6 == nak_src_nla->sa_family) ? (struct pgm_opt_length*)(ncf6 + 1) : (struct pgm_opt_length*)(ncf + 1); + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); +@@ -942,20 +1024,26 @@ + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_nak_list) + + ( (sqn_list->len-1) * sizeof(uint32_t) ) ); ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_NAK_LIST | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_nak_list) + + ( (sqn_list->len-1) * sizeof(uint32_t) ); ++ { + struct pgm_opt_nak_list* opt_nak_list = (struct pgm_opt_nak_list*)(opt_header + 1); + opt_nak_list->opt_reserved = 0; + /* to network-order */ +- for (uint_fast8_t i = 1; i < sqn_list->len; i++) ++ { ++ uint_fast8_t i; ++ for (i = 1; i < sqn_list->len; i++) + opt_nak_list->opt_sqn[i-1] = htonl (sqn_list->sqn[i]); ++ } + + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + ++ { + const ssize_t sent = pgm_sendto (sock, + FALSE, /* not rate limited */ + TRUE, /* with router alert */ +@@ -967,6 +1055,12 @@ + return FALSE; + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length); + return TRUE; ++ } ++ } ++ } ++ } ++ } ++ } + } + + /* cancel any pending heartbeat SPM and schedule a new one +@@ -980,6 +1074,7 @@ + ) + { + pgm_mutex_lock (&sock->timer_mutex); ++ { + const pgm_time_t next_poll = sock->next_poll; + const pgm_time_t spm_heartbeat_interval = sock->spm_heartbeat_interval[ sock->spm_heartbeat_state = 1 ]; + sock->next_heartbeat_spm = now + spm_heartbeat_interval; +@@ -992,6 +1087,7 @@ + } + } + pgm_mutex_unlock (&sock->timer_mutex); ++ } + } + + /* state helper for resuming sends +@@ -1027,6 +1123,7 @@ + pgm_debug ("send_odata (sock:%p skb:%p bytes-written:%p)", + (void*)sock, (void*)skb, (void*)bytes_written); + ++ { + const uint16_t tsdu_length = skb->len; + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + const size_t tpdu_length = tsdu_length + pgm_pkt_offset (FALSE, pgmcc_family); +@@ -1056,6 +1153,7 @@ + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + + STATE(skb)->pgm_header->pgm_checksum = 0; ++ { + void* data = STATE(skb)->pgm_data + 1; + if (sock->use_pgmcc) { + struct pgm_opt_length* opt_len = data; +@@ -1066,23 +1164,28 @@ + ((AF_INET6 == sock->acker_nla.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_data) : + sizeof(struct pgm_opt_pgmcc_data)) ); ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_PGMCC_DATA | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + ((AF_INET6 == sock->acker_nla.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_data) : + sizeof(struct pgm_opt_pgmcc_data)); ++ { + struct pgm_opt_pgmcc_data* pgmcc_data = (struct pgm_opt_pgmcc_data*)(opt_header + 1); + struct pgm_opt6_pgmcc_data* pgmcc_data6 = (struct pgm_opt6_pgmcc_data*)(opt_header + 1); + +- pgmcc_data->opt_tstamp = htonl (pgm_to_msecs (STATE(skb)->tstamp)); ++ pgmcc_data->opt_tstamp = htonl ((unsigned long)pgm_to_msecs (STATE(skb)->tstamp)); + /* acker nla */ + pgm_sockaddr_to_nla ((struct sockaddr*)&sock->acker_nla, (char*)&pgmcc_data->opt_nla_afi); + if (AF_INET6 == sock->acker_nla.ss_family) + data = (char*)pgmcc_data6 + sizeof(struct pgm_opt6_pgmcc_data); + else + data = (char*)pgmcc_data + sizeof(struct pgm_opt_pgmcc_data); ++ } ++ } + } ++ { + const size_t pgm_header_len = (char*)data - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + STATE(unfolded_odata) = pgm_csum_partial (data, tsdu_length, 0); +@@ -1097,6 +1200,7 @@ + * attempt to send a repair-data packet based on in transit original data. + */ + ++ { + ssize_t sent; + retry_send: + +@@ -1157,6 +1261,10 @@ + if (bytes_written) + *bytes_written = tsdu_length; + return PGM_IO_STATUS_NORMAL; ++ } ++ } ++ } ++ } + } + + /* send one PGM original data packet, callee owned memory. +@@ -1183,6 +1291,7 @@ + pgm_debug ("send_odata_copy (sock:%p tsdu:%p tsdu_length:%u bytes-written:%p)", + (void*)sock, tsdu, tsdu_length, (void*)bytes_written); + ++ { + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + const size_t tpdu_length = tsdu_length + pgm_pkt_offset (FALSE, pgmcc_family); + +@@ -1212,6 +1321,7 @@ + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + + STATE(skb)->pgm_header->pgm_checksum = 0; ++ { + void* data = STATE(skb)->pgm_data + 1; + if (sock->use_pgmcc) { + struct pgm_opt_length* opt_len = data; +@@ -1222,21 +1332,26 @@ + ((AF_INET6 == sock->acker_nla.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_data) : + sizeof(struct pgm_opt_pgmcc_data)) ); ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_PGMCC_DATA | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + ((AF_INET6 == sock->acker_nla.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_data) : + sizeof(struct pgm_opt_pgmcc_data)); ++ { + struct pgm_opt_pgmcc_data* pgmcc_data = (struct pgm_opt_pgmcc_data*)(opt_header + 1); + struct pgm_opt6_pgmcc_data* pgmcc_data6 = (struct pgm_opt6_pgmcc_data*)(opt_header + 1); + + pgmcc_data->opt_reserved = 0; +- pgmcc_data->opt_tstamp = htonl (pgm_to_msecs (STATE(skb)->tstamp)); ++ pgmcc_data->opt_tstamp = htonl ((unsigned long)pgm_to_msecs (STATE(skb)->tstamp)); + /* acker nla */ + pgm_sockaddr_to_nla ((struct sockaddr*)&sock->acker_nla, (char*)&pgmcc_data->opt_nla_afi); + data = (char*)opt_header + opt_header->opt_length; ++ } ++ } + } ++ { + const size_t pgm_header_len = (char*)data - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + STATE(unfolded_odata) = pgm_csum_partial_copy (tsdu, data, tsdu_length, 0); +@@ -1247,6 +1362,7 @@ + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + ++ { + ssize_t sent; + retry_send: + +@@ -1309,6 +1425,10 @@ + if (bytes_written) + *bytes_written = tsdu_length; + return PGM_IO_STATUS_NORMAL; ++ } ++ } ++ } ++ } + } + + /* send one PGM original data packet, callee owned scatter/gather io vector +@@ -1347,7 +1467,9 @@ + goto retry_send; + + STATE(tsdu_length) = 0; +- for (unsigned i = 0; i < count; i++) ++ { ++ unsigned i; ++ for (i = 0; i < count; i++) + { + #ifdef TRANSPORT_DEBUG + if (PGM_LIKELY(vector[i].iov_len)) { +@@ -1356,11 +1478,13 @@ + #endif + STATE(tsdu_length) += vector[i].iov_len; + } ++ } + pgm_return_val_if_fail (STATE(tsdu_length) <= sock->max_tsdu, PGM_IO_STATUS_ERROR); + + STATE(skb) = pgm_alloc_skb (sock->max_tpdu); + STATE(skb)->sock = sock; + STATE(skb)->tstamp = pgm_time_update_now(); ++ { + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + pgm_skb_reserve (STATE(skb), pgm_pkt_offset (FALSE, pgmcc_family)); + pgm_skb_put (STATE(skb), STATE(tsdu_length)); +@@ -1379,18 +1503,24 @@ + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + + STATE(skb)->pgm_header->pgm_checksum = 0; ++ { + const size_t pgm_header_len = (char*)(STATE(skb)->pgm_data + 1) - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + + /* unroll first iteration to make friendly branch prediction */ + char* dst = (char*)(STATE(skb)->pgm_data + 1); +- STATE(unfolded_odata) = pgm_csum_partial_copy ((const char*)vector[0].iov_base, dst, vector[0].iov_len, 0); ++ STATE(unfolded_odata) = pgm_csum_partial_copy ((const char*)vector[0].iov_base, dst, (uint16_t)vector[0].iov_len, 0); + + /* iterate over one or more vector elements to perform scatter/gather checksum & copy */ +- for (unsigned i = 1; i < count; i++) { ++ { ++ unsigned i; ++ for (i = 1; i < count; i++) { + dst += vector[i-1].iov_len; +- const uint32_t unfolded_element = pgm_csum_partial_copy ((const char*)vector[i].iov_base, dst, vector[i].iov_len, 0); +- STATE(unfolded_odata) = pgm_csum_block_add (STATE(unfolded_odata), unfolded_element, vector[i-1].iov_len); ++ { ++ const uint32_t unfolded_element = pgm_csum_partial_copy ((const char*)vector[i].iov_base, dst, (uint16_t)vector[i].iov_len, 0); ++ STATE(unfolded_odata) = pgm_csum_block_add (STATE(unfolded_odata), unfolded_element, (uint16_t)vector[i-1].iov_len); ++ } ++ } + } + + STATE(skb)->pgm_header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, STATE(unfolded_odata), pgm_header_len)); +@@ -1400,6 +1530,7 @@ + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + ++ { + ssize_t sent; + size_t tpdu_length; + retry_send: +@@ -1447,6 +1578,9 @@ + if (bytes_written) + *bytes_written = STATE(tsdu_length); + return PGM_IO_STATUS_NORMAL; ++ } ++ } ++ } + } + + /* send PGM original data, callee owned memory. if larger than maximum TPDU +@@ -1530,6 +1664,7 @@ + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + + /* OPT_LENGTH */ ++ { + struct pgm_opt_length* opt_len = (struct pgm_opt_length*)(STATE(skb)->pgm_data + 1); + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); +@@ -1537,6 +1672,7 @@ + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment) ); + /* OPT_FRAGMENT */ ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_FRAGMENT | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + +@@ -1549,6 +1685,7 @@ + + /* TODO: the assembly checksum & copy routine is faster than memcpy & pgm_cksum on >= opteron hardware */ + STATE(skb)->pgm_header->pgm_checksum = 0; ++ { + const size_t pgm_header_len = (char*)(STATE(skb)->pgm_opt_fragment + 1) - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + STATE(unfolded_odata) = pgm_csum_partial_copy ((const char*)apdu + STATE(data_bytes_offset), STATE(skb)->pgm_opt_fragment + 1, STATE(tsdu_length), 0); +@@ -1559,6 +1696,7 @@ + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + ++ { + ssize_t sent; + size_t tpdu_length; + retry_send: +@@ -1596,6 +1734,10 @@ + pgm_schedule_proactive_nak (sock, odata_sqn & tg_sqn_mask); + } + ++ } ++ } ++ } ++ } + } while ( STATE(data_bytes_offset) < apdu_length); + pgm_assert( STATE(data_bytes_offset) == apdu_length ); + +@@ -1638,7 +1780,7 @@ + size_t* restrict bytes_written + ) + { +- pgm_debug ("pgm_send (sock:%p apdu:%p apdu-length:%zu bytes-written:%p)", ++ pgm_debug ("pgm_send (sock:%p apdu:%p apdu-length:%lu bytes-written:%p)", + (void*)sock, apdu, apdu_length, (void*)bytes_written); + + /* parameters */ +@@ -1670,10 +1812,12 @@ + return status; + } + ++ { + const int status = send_apdu (sock, apdu, apdu_length, bytes_written); + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; ++ } + } + + /* send PGM original data, callee owned scatter/gather IO vector. if larger than maximum TPDU +@@ -1735,6 +1879,7 @@ + return status; + } + ++ { + size_t bytes_sent = 0; + unsigned packets_sent = 0; + size_t data_bytes_sent = 0; +@@ -1759,7 +1904,9 @@ + + /* calculate (total) APDU length */ + STATE(apdu_length) = 0; +- for (unsigned i = 0; i < count; i++) ++ { ++ unsigned i; ++ for (i = 0; i < count; i++) + { + #ifdef TRANSPORT_DEBUG + if (PGM_LIKELY(vector[i].iov_len)) { +@@ -1775,6 +1922,7 @@ + } + STATE(apdu_length) += vector[i].iov_len; + } ++ } + + /* pass on non-fragment calls */ + if (is_one_apdu) { +@@ -1885,6 +2033,7 @@ + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + + /* OPT_LENGTH */ ++ { + struct pgm_opt_length* opt_len = (struct pgm_opt_length*)(STATE(skb)->pgm_data + 1); + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); +@@ -1892,6 +2041,7 @@ + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment) ); + /* OPT_FRAGMENT */ ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_FRAGMENT | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + +@@ -1904,6 +2054,7 @@ + + /* checksum & copy */ + STATE(skb)->pgm_header->pgm_checksum = 0; ++ { + const size_t pgm_header_len = (char*)(STATE(skb)->pgm_opt_fragment + 1) - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + +@@ -1941,8 +2092,10 @@ + dst += copy_length; + src_length = vector[STATE(vector_index)].iov_len - STATE(vector_offset); + copy_length = MIN( STATE(tsdu_length) - dst_length, src_length ); ++ { + const uint32_t unfolded_element = pgm_csum_partial_copy (src, dst, copy_length, 0); + STATE(unfolded_odata) = pgm_csum_block_add (STATE(unfolded_odata), unfolded_element, dst_length); ++ } + } + + STATE(skb)->pgm_header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, STATE(unfolded_odata), pgm_header_len)); +@@ -1952,6 +2105,7 @@ + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + ++ { + ssize_t sent; + size_t tpdu_length; + retry_one_apdu_send: +@@ -1988,6 +2142,10 @@ + pgm_schedule_proactive_nak (sock, odata_sqn & tg_sqn_mask); + } + ++ } ++ } ++ } ++ } + } while ( STATE(data_bytes_offset) < STATE(apdu_length) ); + pgm_assert( STATE(data_bytes_offset) == STATE(apdu_length) ); + +@@ -2018,6 +2176,7 @@ + return PGM_IO_STATUS_WOULD_BLOCK; + } + return PGM_IO_STATUS_RATE_LIMITED; ++ } + } + + /* send PGM original data, transmit window owned scatter/gather IO vector. +@@ -2077,6 +2236,7 @@ + return status; + } + ++ { + size_t bytes_sent = 0; + unsigned packets_sent = 0; + size_t data_bytes_sent = 0; +@@ -2090,8 +2250,11 @@ + if (sock->is_nonblocking && sock->is_controlled_odata) + { + size_t total_tpdu_length = 0; +- for (unsigned i = 0; i < count; i++) ++ { ++ unsigned i; ++ for (i = 0; i < count; i++) + total_tpdu_length += sock->iphdr_len + pgm_pkt_offset (is_one_apdu, pgmcc_family) + vector[i]->len; ++ } + + /* calculation includes one iphdr length already */ + if (!pgm_rate_check (&sock->rate_control, +@@ -2110,7 +2273,9 @@ + { + STATE(apdu_length) = 0; + STATE(first_sqn) = pgm_txw_next_lead(sock->window); +- for (unsigned i = 0; i < count; i++) ++ { ++ unsigned i; ++ for (i = 0; i < count; i++) + { + if (PGM_UNLIKELY(vector[i]->len > sock->max_tsdu_fragment)) { + pgm_mutex_unlock (&sock->source_mutex); +@@ -2119,6 +2284,7 @@ + } + STATE(apdu_length) += vector[i]->len; + } ++ } + if (PGM_UNLIKELY(STATE(apdu_length) > sock->max_apdu)) { + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); +@@ -2157,6 +2323,7 @@ + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment) ); + /* OPT_FRAGMENT */ ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_FRAGMENT | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + +@@ -2168,6 +2335,7 @@ + STATE(skb)->pgm_opt_fragment->opt_frag_len = htonl (STATE(apdu_length)); + + pgm_assert (STATE(skb)->data == (STATE(skb)->pgm_opt_fragment + 1)); ++ } + } + else + { +@@ -2177,6 +2345,7 @@ + /* TODO: the assembly checksum & copy routine is faster than memcpy & pgm_cksum on >= opteron hardware */ + STATE(skb)->pgm_header->pgm_checksum = 0; + pgm_assert ((char*)STATE(skb)->data > (char*)STATE(skb)->pgm_header); ++ { + const size_t pgm_header_len = (char*)STATE(skb)->data - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + STATE(unfolded_odata) = pgm_csum_partial ((char*)STATE(skb)->data, STATE(tsdu_length), 0); +@@ -2186,6 +2355,7 @@ + pgm_spinlock_lock (&sock->txw_spinlock); + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); ++ { + ssize_t sent; + size_t tpdu_length; + retry_send: +@@ -2223,6 +2393,8 @@ + if (!((odata_sqn + 1) & ~tg_sqn_mask)) + pgm_schedule_proactive_nak (sock, odata_sqn & tg_sqn_mask); + } ++ } ++ } + + } + #ifdef TRANSPORT_DEBUG +@@ -2259,6 +2431,7 @@ + return PGM_IO_STATUS_WOULD_BLOCK; + } + return PGM_IO_STATUS_RATE_LIMITED; ++ } + } + + /* cleanup resuming send state helper +@@ -2282,6 +2455,7 @@ + pgm_assert (NULL != skb); + pgm_assert ((char*)skb->tail > (char*)skb->head); + ++ { + const size_t tpdu_length = (char*)skb->tail - (char*)skb->head; + + /* update previous odata/rdata contents */ +@@ -2292,6 +2466,7 @@ + rdata->data_trail = htonl (pgm_txw_trail(sock->window)); + + header->pgm_checksum = 0; ++ { + const size_t pgm_header_len = tpdu_length - ntohs(header->pgm_tsdu_length); + uint32_t unfolded_header = pgm_csum_partial (header, pgm_header_len, 0); + uint32_t unfolded_odata = pgm_txw_get_unfolded_checksum (skb); +@@ -2306,6 +2481,7 @@ + return FALSE; + } + ++ { + const ssize_t sent = pgm_sendto (sock, + sock->is_controlled_rdata, /* rate limited */ + TRUE, /* with router alert */ +@@ -2319,6 +2495,7 @@ + return FALSE; + } + ++ { + const pgm_time_t now = pgm_time_update_now(); + + if (sock->use_pgmcc) { +@@ -2338,6 +2515,10 @@ + sock->cumulative_stats[PGM_PC_SOURCE_SELECTIVE_MSGS_RETRANSMITTED]++; /* impossible to determine APDU count */ + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length + sock->iphdr_len); + return TRUE; ++ } ++ } ++ } ++ } + } + + /* eof */ diff --git a/3rdparty/openpgm-svn-r1135/pgm/source.c.orig b/3rdparty/openpgm-svn-r1135/pgm/source.c.orig new file mode 100644 index 0000000..2c197cd --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/source.c.orig @@ -0,0 +1,2344 @@ +/* vim:ts=8:sts=8:sw=4:noai:noexpandtab + * + * PGM source socket. + * + * Copyright (c) 2006-2010 Miru Limited. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#define __STDC_FORMAT_MACROS +#ifdef _MSC_VER +# include <pgm/wininttypes.h> +#else +# include <inttypes.h> +#endif +#include <errno.h> +#include <impl/i18n.h> +#include <impl/framework.h> +#include <impl/socket.h> +#include <impl/source.h> +#include <impl/sqn_list.h> +#include <impl/packet_parse.h> +#include <impl/net.h> + + +//#define SOURCE_DEBUG + +#ifndef SOURCE_DEBUG +# define PGM_DISABLE_ASSERT +#endif + +#if !defined(ENOBUFS) && defined(WSAENOBUFS) +# define ENOBUFS WSAENOBUFS +#endif + + +/* locals */ +static inline bool peer_is_source (const pgm_peer_t*) PGM_GNUC_CONST; +static inline bool peer_is_peer (const pgm_peer_t*) PGM_GNUC_CONST; +static void reset_heartbeat_spm (pgm_sock_t*const, const pgm_time_t); +static bool send_ncf (pgm_sock_t*const restrict, const struct sockaddr*const restrict, const struct sockaddr*const restrict, const uint32_t, const bool); +static bool send_ncf_list (pgm_sock_t*const restrict, const struct sockaddr*const restrict, const struct sockaddr*const restrict, struct pgm_sqn_list_t*const restrict, const bool); +static int send_odata (pgm_sock_t*const restrict, struct pgm_sk_buff_t*const restrict, size_t*restrict); +static int send_odata_copy (pgm_sock_t*const restrict, const void*restrict, const uint16_t, size_t*restrict); +static int send_odatav (pgm_sock_t*const restrict, const struct pgm_iovec*const restrict, const unsigned, size_t*restrict); +static bool send_rdata (pgm_sock_t*restrict, struct pgm_sk_buff_t*restrict); + + +static inline +unsigned +_pgm_popcount ( + uint32_t n + ) +{ +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) + return __builtin_popcount (n); +#else +/* MIT HAKMEM 169 */ + const uint32_t t = n - ((n >> 1) & 033333333333) + - ((n >> 2) & 011111111111); + return ((t + (t >> 3) & 030707070707)) % 63; +#endif +} + +static inline +bool +peer_is_source ( + const pgm_peer_t* peer + ) +{ + return (NULL == peer); +} + +static inline +bool +peer_is_peer ( + const pgm_peer_t* peer + ) +{ + return (NULL != peer); +} + +static inline +void +reset_spmr_timer ( + pgm_peer_t* const peer + ) +{ + peer->spmr_expiry = 0; +} + +static inline +size_t +source_max_tsdu ( + const pgm_sock_t* sock, + const bool can_fragment + ) +{ + size_t max_tsdu = can_fragment ? sock->max_tsdu_fragment : sock->max_tsdu; + if (sock->use_var_pktlen /* OPT_VAR_PKT_LEN */) + max_tsdu -= sizeof (uint16_t); + return max_tsdu; +} + +/* prototype of function to send pro-active parity NAKs. + */ +static +bool +pgm_schedule_proactive_nak ( + pgm_sock_t* sock, + uint32_t nak_tg_sqn /* transmission group (shifted) */ + ) +{ + pgm_return_val_if_fail (NULL != sock, FALSE); + const bool status = pgm_txw_retransmit_push (sock->window, + nak_tg_sqn | sock->rs_proactive_h, + TRUE /* is_parity */, + sock->tg_sqn_shift); + return status; +} + +/* a deferred request for RDATA, now processing in the timer thread, we check the transmit + * window to see if the packet exists and forward on, maintaining a lock until the queue is + * empty. + * + * returns TRUE on success, returns FALSE if operation would block. + */ + +bool +pgm_on_deferred_nak ( + pgm_sock_t* const sock + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + +/* We can flush queue and block all odata, or process one set, or process each + * sequence number individually. + */ + +/* parity packets are re-numbered across the transmission group with index h, sharing the space + * with the original packets. beyond the transmission group size (k), the PGM option OPT_PARITY_GRP + * provides the extra offset value. + */ + +/* peek from the retransmit queue so we can eliminate duplicate NAKs up until the repair packet + * has been retransmitted. + */ + pgm_spinlock_lock (&sock->txw_spinlock); + struct pgm_sk_buff_t* skb = pgm_txw_retransmit_try_peek (sock->window); + if (skb) { + skb = pgm_skb_get (skb); + pgm_spinlock_unlock (&sock->txw_spinlock); + if (!send_rdata (sock, skb)) { + pgm_free_skb (skb); + pgm_notify_send (&sock->rdata_notify); + return FALSE; + } + pgm_free_skb (skb); +/* now remove sequence number from retransmit queue, re-enabling NAK processing for this sequence number */ + pgm_txw_retransmit_remove_head (sock->window); + } else + pgm_spinlock_unlock (&sock->txw_spinlock); + return TRUE; +} + +/* SPMR indicates if multicast to cancel own SPMR, or unicast to send SPM. + * + * rate limited to 1/IHB_MIN per TSI (13.4). + * + * if SPMR was valid, returns TRUE, if invalid returns FALSE. + */ + +bool +pgm_on_spmr ( + pgm_sock_t* const restrict sock, + pgm_peer_t* const restrict peer, /* maybe NULL if socket is source */ + struct pgm_sk_buff_t* const restrict skb + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != skb); + + pgm_debug ("pgm_on_spmr (sock:%p peer:%p skb:%p)", + (void*)sock, (void*)peer, (void*)skb); + + if (PGM_UNLIKELY(!pgm_verify_spmr (skb))) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Malformed SPMR rejected.")); + return FALSE; + } + + if (peer_is_source (peer)) { + const bool send_status = pgm_send_spm (sock, 0); + if (PGM_UNLIKELY(!send_status)) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Failed to send SPM on SPM-Request.")); + } + } else { + pgm_trace (PGM_LOG_ROLE_RX_WINDOW,_("Suppressing SPMR due to peer multicast SPMR.")); + reset_spmr_timer (peer); + } + return TRUE; +} + +/* Process opt_pgmcc_feedback PGM option that ships attached to ACK or NAK. + * Contents use to elect best ACKer. + * + * returns TRUE if peer is the elected ACKer. + */ + +static +bool +on_opt_pgmcc_feedback ( + pgm_sock_t* const restrict sock, + const struct pgm_sk_buff_t* const restrict skb, + const struct pgm_opt_pgmcc_feedback* restrict opt_pgmcc_feedback + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != skb); + pgm_assert (NULL != opt_pgmcc_feedback); + + const uint32_t opt_tstamp = ntohl (opt_pgmcc_feedback->opt_tstamp); + const uint16_t opt_loss_rate = ntohs (opt_pgmcc_feedback->opt_loss_rate); + + const uint32_t rtt = pgm_to_msecs (skb->tstamp) - opt_tstamp; + const uint64_t peer_loss = rtt * rtt * opt_loss_rate; + + struct sockaddr_storage peer_nla; + pgm_nla_to_sockaddr (&opt_pgmcc_feedback->opt_nla_afi, (struct sockaddr*)&peer_nla); + +/* ACKer elections */ + if (PGM_UNLIKELY(pgm_sockaddr_is_addr_unspecified ((const struct sockaddr*)&sock->acker_nla))) + { + pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("Elected first ACKer")); + memcpy (&sock->acker_nla, &peer_nla, pgm_sockaddr_storage_len (&peer_nla)); + } + else if (peer_loss > sock->acker_loss && + 0 != pgm_sockaddr_cmp ((const struct sockaddr*)&peer_nla, (const struct sockaddr*)&sock->acker_nla)) + { + pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("Elected new ACKer")); + memcpy (&sock->acker_nla, &peer_nla, pgm_sockaddr_storage_len (&peer_nla)); + } + +/* update ACKer state */ + if (0 == pgm_sockaddr_cmp ((const struct sockaddr*)&peer_nla, (const struct sockaddr*)&sock->acker_nla)) + { + sock->acker_loss = peer_loss; + return TRUE; + } + + return FALSE; +} + +/* NAK requesting RDATA transmission for a sending sock, only valid if + * sequence number(s) still in transmission window. + * + * we can potentially have different IP versions for the NAK packet to the send group. + * + * TODO: fix IPv6 AFIs + * + * take in a NAK and pass off to an asynchronous queue for another thread to process + * + * if NAK is valid, returns TRUE. on error, FALSE is returned. + */ + +bool +pgm_on_nak ( + pgm_sock_t* const restrict sock, + struct pgm_sk_buff_t* const restrict skb + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != skb); + + pgm_debug ("pgm_on_nak (sock:%p skb:%p)", + (const void*)sock, (const void*)skb); + + const bool is_parity = skb->pgm_header->pgm_options & PGM_OPT_PARITY; + if (is_parity) { + sock->cumulative_stats[PGM_PC_SOURCE_PARITY_NAKS_RECEIVED]++; + if (!sock->use_ondemand_parity) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Parity NAK rejected as on-demand parity is not enabled.")); + sock->cumulative_stats[PGM_PC_SOURCE_MALFORMED_NAKS]++; + return FALSE; + } + } else + sock->cumulative_stats[PGM_PC_SOURCE_SELECTIVE_NAKS_RECEIVED]++; + + if (PGM_UNLIKELY(!pgm_verify_nak (skb))) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Malformed NAK rejected.")); + sock->cumulative_stats[PGM_PC_SOURCE_MALFORMED_NAKS]++; + return FALSE; + } + + const struct pgm_nak* nak = (struct pgm_nak*) skb->data; + const struct pgm_nak6* nak6 = (struct pgm_nak6*)skb->data; + +/* NAK_SRC_NLA contains our sock unicast NLA */ + struct sockaddr_storage nak_src_nla; + pgm_nla_to_sockaddr (&nak->nak_src_nla_afi, (struct sockaddr*)&nak_src_nla); + if (PGM_UNLIKELY(pgm_sockaddr_cmp ((struct sockaddr*)&nak_src_nla, (struct sockaddr*)&sock->send_addr) != 0)) + { + char saddr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&nak_src_nla, saddr, sizeof(saddr)); + pgm_trace (PGM_LOG_ROLE_NETWORK,_("NAK rejected for unmatched NLA: %s"), saddr); + sock->cumulative_stats[PGM_PC_SOURCE_MALFORMED_NAKS]++; + return FALSE; + } + +/* NAK_GRP_NLA containers our sock multicast group */ + struct sockaddr_storage nak_grp_nla; + pgm_nla_to_sockaddr ((AF_INET6 == nak_src_nla.ss_family) ? &nak6->nak6_grp_nla_afi : &nak->nak_grp_nla_afi, (struct sockaddr*)&nak_grp_nla); + if (PGM_UNLIKELY(pgm_sockaddr_cmp ((struct sockaddr*)&nak_grp_nla, (struct sockaddr*)&sock->send_gsr.gsr_group) != 0)) + { + char sgroup[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&nak_src_nla, sgroup, sizeof(sgroup)); + pgm_trace (PGM_LOG_ROLE_NETWORK,_("NAK rejected as targeted for different multicast group: %s"), sgroup); + sock->cumulative_stats[PGM_PC_SOURCE_MALFORMED_NAKS]++; + return FALSE; + } + +/* create queue object */ + struct pgm_sqn_list_t sqn_list; + sqn_list.sqn[0] = ntohl (nak->nak_sqn); + sqn_list.len = 1; + + pgm_debug ("nak_sqn %" PRIu32, sqn_list.sqn[0]); + +/* check NAK list */ + const uint32_t* nak_list = NULL; + uint_fast8_t nak_list_len = 0; + if (skb->pgm_header->pgm_options & PGM_OPT_PRESENT) + { + const struct pgm_opt_length* opt_len = (AF_INET6 == nak_src_nla.ss_family) ? + (const struct pgm_opt_length*)(nak6 + 1) : + (const struct pgm_opt_length*)(nak + 1); + if (PGM_UNLIKELY(opt_len->opt_type != PGM_OPT_LENGTH)) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Malformed NAK rejected.")); + sock->cumulative_stats[PGM_PC_SOURCE_MALFORMED_NAKS]++; + return FALSE; + } + if (PGM_UNLIKELY(opt_len->opt_length != sizeof(struct pgm_opt_length))) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Malformed NAK rejected.")); + sock->cumulative_stats[PGM_PC_SOURCE_MALFORMED_NAKS]++; + return FALSE; + } +/* TODO: check for > 16 options & past packet end */ + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)opt_len; + do { + opt_header = (const struct pgm_opt_header*)((const char*)opt_header + opt_header->opt_length); + if ((opt_header->opt_type & PGM_OPT_MASK) == PGM_OPT_NAK_LIST) { + nak_list = ((const struct pgm_opt_nak_list*)(opt_header + 1))->opt_sqn; + nak_list_len = ( opt_header->opt_length - sizeof(struct pgm_opt_header) - sizeof(uint8_t) ) / sizeof(uint32_t); + break; + } + } while (!(opt_header->opt_type & PGM_OPT_END)); + } + +/* nak list numbers */ + if (PGM_UNLIKELY(nak_list_len > 63)) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Malformed NAK rejected on too long sequence list.")); + return FALSE; + } + + for (uint_fast8_t i = 0; i < nak_list_len; i++) + { + sqn_list.sqn[sqn_list.len++] = ntohl (*nak_list); + nak_list++; + } + +/* send NAK confirm packet immediately, then defer to timer thread for a.s.a.p + * delivery of the actual RDATA packets. blocking send for NCF is ignored as RDATA + * broadcast will be sent later. + */ + if (nak_list_len) + send_ncf_list (sock, (struct sockaddr*)&nak_src_nla, (struct sockaddr*)&nak_grp_nla, &sqn_list, is_parity); + else + send_ncf (sock, (struct sockaddr*)&nak_src_nla, (struct sockaddr*)&nak_grp_nla, sqn_list.sqn[0], is_parity); + +/* queue retransmit requests */ + for (uint_fast8_t i = 0; i < sqn_list.len; i++) { + const bool push_status = pgm_txw_retransmit_push (sock->window, sqn_list.sqn[i], is_parity, sock->tg_sqn_shift); + if (PGM_UNLIKELY(!push_status)) { + pgm_trace (PGM_LOG_ROLE_TX_WINDOW,_("Failed to push retransmit request for #%" PRIu32), sqn_list.sqn[i]); + } + } + return TRUE; +} + +/* Null-NAK, or N-NAK propogated by a DLR for hand waving excitement + * + * if NNAK is valid, returns TRUE. on error, FALSE is returned. + */ + +bool +pgm_on_nnak ( + pgm_sock_t* const restrict sock, + struct pgm_sk_buff_t* const restrict skb + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != skb); + + pgm_debug ("pgm_on_nnak (sock:%p skb:%p)", + (void*)sock, (void*)skb); + + sock->cumulative_stats[PGM_PC_SOURCE_SELECTIVE_NNAK_PACKETS_RECEIVED]++; + + if (PGM_UNLIKELY(!pgm_verify_nnak (skb))) { + sock->cumulative_stats[PGM_PC_SOURCE_NNAK_ERRORS]++; + return FALSE; + } + + const struct pgm_nak* nnak = (struct pgm_nak*) skb->data; + const struct pgm_nak6* nnak6 = (struct pgm_nak6*)skb->data; + +/* NAK_SRC_NLA contains our sock unicast NLA */ + struct sockaddr_storage nnak_src_nla; + pgm_nla_to_sockaddr (&nnak->nak_src_nla_afi, (struct sockaddr*)&nnak_src_nla); + + if (PGM_UNLIKELY(pgm_sockaddr_cmp ((struct sockaddr*)&nnak_src_nla, (struct sockaddr*)&sock->send_addr) != 0)) + { + sock->cumulative_stats[PGM_PC_SOURCE_NNAK_ERRORS]++; + return FALSE; + } + +/* NAK_GRP_NLA containers our sock multicast group */ + struct sockaddr_storage nnak_grp_nla; + pgm_nla_to_sockaddr ((AF_INET6 == nnak_src_nla.ss_family) ? &nnak6->nak6_grp_nla_afi : &nnak->nak_grp_nla_afi, (struct sockaddr*)&nnak_grp_nla); + if (PGM_UNLIKELY(pgm_sockaddr_cmp ((struct sockaddr*)&nnak_grp_nla, (struct sockaddr*)&sock->send_gsr.gsr_group) != 0)) + { + sock->cumulative_stats[PGM_PC_SOURCE_NNAK_ERRORS]++; + return FALSE; + } + +/* check NNAK list */ + uint_fast8_t nnak_list_len = 0; + if (skb->pgm_header->pgm_options & PGM_OPT_PRESENT) + { + const struct pgm_opt_length* opt_len = (AF_INET6 == nnak_src_nla.ss_family) ? + (const struct pgm_opt_length*)(nnak6 + 1) : + (const struct pgm_opt_length*)(nnak + 1); + if (PGM_UNLIKELY(opt_len->opt_type != PGM_OPT_LENGTH)) { + sock->cumulative_stats[PGM_PC_SOURCE_NNAK_ERRORS]++; + return FALSE; + } + if (PGM_UNLIKELY(opt_len->opt_length != sizeof(struct pgm_opt_length))) { + sock->cumulative_stats[PGM_PC_SOURCE_NNAK_ERRORS]++; + return FALSE; + } +/* TODO: check for > 16 options & past packet end */ + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)opt_len; + do { + opt_header = (const struct pgm_opt_header*)((const char*)opt_header + opt_header->opt_length); + if ((opt_header->opt_type & PGM_OPT_MASK) == PGM_OPT_NAK_LIST) { + nnak_list_len = ( opt_header->opt_length - sizeof(struct pgm_opt_header) - sizeof(uint8_t) ) / sizeof(uint32_t); + break; + } + } while (!(opt_header->opt_type & PGM_OPT_END)); + } + + sock->cumulative_stats[PGM_PC_SOURCE_SELECTIVE_NNAKS_RECEIVED] += 1 + nnak_list_len; + return TRUE; +} + +/* ACK, sent upstream by one selected ACKER for congestion control feedback. + * + * if ACK is valid, returns TRUE. on error, FALSE is returned. + */ + +bool +pgm_on_ack ( + pgm_sock_t* const restrict sock, + struct pgm_sk_buff_t* const restrict skb + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != skb); + + pgm_debug ("pgm_on_ack (sock:%p skb:%p)", + (const void*)sock, (const void*)skb); + + sock->cumulative_stats[PGM_PC_SOURCE_ACK_PACKETS_RECEIVED]++; + + if (PGM_UNLIKELY(!pgm_verify_ack (skb))) { + sock->cumulative_stats[PGM_PC_SOURCE_ACK_ERRORS]++; + return FALSE; + } + + if (!sock->use_pgmcc) + return FALSE; + + const struct pgm_ack* ack = (struct pgm_ack*)skb->data; + bool is_acker = FALSE; + +/* check PGMCC feedback option for new elections */ + if (skb->pgm_header->pgm_options & PGM_OPT_PRESENT) + { + const struct pgm_opt_length* opt_len = (const struct pgm_opt_length*)(ack + 1); + if (PGM_UNLIKELY(opt_len->opt_type != PGM_OPT_LENGTH)) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Malformed ACK rejected.")); + return FALSE; + } + if (PGM_UNLIKELY(opt_len->opt_length != sizeof(struct pgm_opt_length))) { + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Malformed ACK rejected.")); + return FALSE; + } + const struct pgm_opt_header* opt_header = (const struct pgm_opt_header*)opt_len; + do { + opt_header = (const struct pgm_opt_header*)((const char*)opt_header + opt_header->opt_length); + if ((opt_header->opt_type & PGM_OPT_MASK) == PGM_OPT_PGMCC_FEEDBACK) { + const struct pgm_opt_pgmcc_feedback* opt_pgmcc_feedback = (const struct pgm_opt_pgmcc_feedback*)(opt_header + 1); + is_acker = on_opt_pgmcc_feedback (sock, skb, opt_pgmcc_feedback); + break; /* ignore other options */ + } + } while (!(opt_header->opt_type & PGM_OPT_END)); + } + +/* ignore ACKs from other receivers or sessions */ + if (!is_acker) + return TRUE; + +/* reset ACK expiration */ + sock->next_crqst = 0; + +/* count new ACK sequences */ + const uint32_t ack_rx_max = ntohl (ack->ack_rx_max); + const int32_t delta = ack_rx_max - sock->ack_rx_max; +/* ignore older ACKs when multiple active ACKers */ + if (pgm_uint32_gt (ack_rx_max, sock->ack_rx_max)) + sock->ack_rx_max = ack_rx_max; + uint32_t ack_bitmap = ntohl (ack->ack_bitmap); + if (delta > 32) sock->ack_bitmap = 0; /* sequence jump ahead beyond past bitmap */ + else if (delta > 0) sock->ack_bitmap <<= delta; /* immediate sequence */ + else if (delta > -32) ack_bitmap <<= -delta; /* repair sequence scoped by bitmap */ + else ack_bitmap = 0; /* old sequence */ + unsigned new_acks = _pgm_popcount (ack_bitmap & ~sock->ack_bitmap); + sock->ack_bitmap |= ack_bitmap; + + if (0 == new_acks) + return TRUE; + + const bool is_congestion_limited = (sock->tokens < pgm_fp8 (1)); + +/* after loss detection cancel any further manipulation of the window + * until feedback is received for the next transmitted packet. + */ + if (sock->is_congested) + { + if (pgm_uint32_lte (ack_rx_max, sock->suspended_sqn)) + { + pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("PGMCC window token manipulation suspended due to congestion (T:%u W:%u)"), + pgm_fp8tou (sock->tokens), pgm_fp8tou (sock->cwnd_size)); + const uint_fast32_t token_inc = pgm_fp8mul (pgm_fp8 (new_acks), pgm_fp8 (1) + pgm_fp8div (pgm_fp8 (1), sock->cwnd_size)); + sock->tokens = MIN( sock->tokens + token_inc, sock->cwnd_size ); + goto notify_tx; + } + sock->is_congested = FALSE; + } + +/* count outstanding lost sequences */ + const unsigned total_lost = _pgm_popcount (~sock->ack_bitmap); + +/* no detected data loss at ACKer, increase congestion window size */ + if (0 == total_lost) + { + new_acks += sock->acks_after_loss; + sock->acks_after_loss = 0; + uint_fast32_t n = pgm_fp8 (new_acks); + uint_fast32_t token_inc = 0; + +/* slow-start phase, exponential increase to SSTHRESH */ + if (sock->cwnd_size < sock->ssthresh) { + const uint_fast32_t d = MIN( n, sock->ssthresh - sock->cwnd_size ); + n -= d; + token_inc = d + d; + sock->cwnd_size += d; + } + + const uint_fast32_t iw = pgm_fp8div (pgm_fp8 (1), sock->cwnd_size); + +/* linear window increase */ + token_inc += pgm_fp8mul (n, pgm_fp8 (1) + iw); + sock->cwnd_size += pgm_fp8mul (n, iw); + sock->tokens = MIN( sock->tokens + token_inc, sock->cwnd_size ); +// pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("PGMCC++ (T:%u W:%u)"), +// pgm_fp8tou (sock->tokens), pgm_fp8tou (sock->cwnd_size)); + } + else + { +/* Look for an unacknowledged data packet which is followed by at least three + * acknowledged data packets, then the packet is assumed to be lost and PGMCC + * reacts by halving the window. + * + * Common value will be 0xfffffff7. + */ + sock->acks_after_loss += new_acks; + if (sock->acks_after_loss >= 3) + { + sock->acks_after_loss = 0; + sock->suspended_sqn = ack_rx_max; + sock->is_congested = TRUE; + sock->cwnd_size = pgm_fp8div (sock->cwnd_size, pgm_fp8 (2)); + if (sock->cwnd_size > sock->tokens) + sock->tokens = 0; + else + sock->tokens -= sock->cwnd_size; + sock->ack_bitmap = 0xffffffff; + pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("PGMCC congestion, half window size (T:%u W:%u)"), + pgm_fp8tou (sock->tokens), pgm_fp8tou (sock->cwnd_size)); + } + } + +/* token is now available so notify tx thread that transmission time is available */ +notify_tx: + if (is_congestion_limited && + sock->tokens >= pgm_fp8 (1)) + { + pgm_notify_send (&sock->ack_notify); + } + return TRUE; +} + +/* ambient/heartbeat SPM's + * + * heartbeat: ihb_tmr decaying between ihb_min and ihb_max 2x after last packet + * + * on success, TRUE is returned, if operation would block, FALSE is returned. + */ + +bool +pgm_send_spm ( + pgm_sock_t* const sock, + const int flags + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != sock->window); + + pgm_debug ("pgm_send_spm (sock:%p flags:%d)", + (const void*)sock, flags); + + size_t tpdu_length = sizeof(struct pgm_header); + if (AF_INET == sock->send_gsr.gsr_group.ss_family) + tpdu_length += sizeof(struct pgm_spm); + else + tpdu_length += sizeof(struct pgm_spm6); + if (sock->use_proactive_parity || + sock->use_ondemand_parity || + sock->is_pending_crqst || + PGM_OPT_FIN == flags) + { + tpdu_length += sizeof(struct pgm_opt_length); +/* forward error correction */ + if (sock->use_proactive_parity || + sock->use_ondemand_parity) + tpdu_length += sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_parity_prm); +/* congestion report request */ + if (sock->is_pending_crqst) + tpdu_length += sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_crqst); +/* end of session */ + if (PGM_OPT_FIN == flags) + tpdu_length += sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fin); + } + char buf[ tpdu_length ]; + if (PGM_UNLIKELY(pgm_mem_gc_friendly)) + memset (buf, 0, tpdu_length); + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_spm* spm = (struct pgm_spm *)(header + 1); + struct pgm_spm6* spm6 = (struct pgm_spm6*)(header + 1); + memcpy (header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + header->pgm_sport = sock->tsi.sport; + header->pgm_dport = sock->dport; + header->pgm_type = PGM_SPM; + header->pgm_options = 0; + header->pgm_tsdu_length = 0; + +/* SPM */ + spm->spm_sqn = htonl (sock->spm_sqn); + spm->spm_trail = htonl (pgm_txw_trail_atomic (sock->window)); + spm->spm_lead = htonl (pgm_txw_lead_atomic (sock->window)); + spm->spm_reserved = 0; +/* our nla */ + pgm_sockaddr_to_nla ((struct sockaddr*)&sock->send_addr, (char*)&spm->spm_nla_afi); + +/* PGM options */ + if (sock->use_proactive_parity || + sock->use_ondemand_parity || + sock->is_pending_crqst || + PGM_OPT_FIN == flags) + { + struct pgm_opt_length* opt_len; + struct pgm_opt_header *opt_header, *last_opt_header; + uint16_t opt_total_length; + + if (AF_INET == sock->send_gsr.gsr_group.ss_family) + opt_header = (struct pgm_opt_header*)(spm + 1); + else + opt_header = (struct pgm_opt_header*)(spm6 + 1); + header->pgm_options |= PGM_OPT_PRESENT; + opt_len = (struct pgm_opt_length*)opt_header; + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); + opt_total_length = sizeof(struct pgm_opt_length); + last_opt_header = opt_header = (struct pgm_opt_header*)(opt_len + 1); + +/* OPT_PARITY_PRM */ + if (sock->use_proactive_parity || + sock->use_ondemand_parity) + { + header->pgm_options |= PGM_OPT_NETWORK; + opt_total_length += sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_parity_prm); + opt_header->opt_type = PGM_OPT_PARITY_PRM; + opt_header->opt_length = sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_parity_prm); + struct pgm_opt_parity_prm* opt_parity_prm = (struct pgm_opt_parity_prm*)(opt_header + 1); + opt_parity_prm->opt_reserved = (sock->use_proactive_parity ? PGM_PARITY_PRM_PRO : 0) | + (sock->use_ondemand_parity ? PGM_PARITY_PRM_OND : 0); + opt_parity_prm->parity_prm_tgs = htonl (sock->rs_k); + last_opt_header = opt_header; + opt_header = (struct pgm_opt_header*)(opt_parity_prm + 1); + } + +/* OPT_CRQST */ + if (sock->is_pending_crqst) + { + header->pgm_options |= PGM_OPT_NETWORK; + opt_total_length += sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_crqst); + opt_header->opt_type = PGM_OPT_CRQST; + opt_header->opt_length = sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_crqst); + struct pgm_opt_crqst* opt_crqst = (struct pgm_opt_crqst*)(opt_header + 1); +/* request receiver worst path report, OPT_CR_RX_WP */ + opt_crqst->opt_reserved = PGM_OPT_CRQST_RXP; + sock->is_pending_crqst = FALSE; + last_opt_header = opt_header; + opt_header = (struct pgm_opt_header*)(opt_crqst + 1); + } + +/* OPT_FIN */ + if (PGM_OPT_FIN == flags) + { + opt_total_length += sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fin); + opt_header->opt_type = PGM_OPT_FIN; + opt_header->opt_length = sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_fin); + struct pgm_opt_fin* opt_fin = (struct pgm_opt_fin*)(opt_header + 1); + opt_fin->opt_reserved = 0; + last_opt_header = opt_header; + opt_header = (struct pgm_opt_header*)(opt_fin + 1); + } + + last_opt_header->opt_type |= PGM_OPT_END; + opt_len->opt_total_length = htons (opt_total_length); + } + +/* checksum optional for SPMs */ + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + + const ssize_t sent = pgm_sendto (sock, + flags != PGM_OPT_SYN && sock->is_controlled_spm, /* rate limited */ + TRUE, /* with router alert */ + buf, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + if (sent < 0 && (EAGAIN == errno || ENOBUFS == errno)) { + sock->blocklen = tpdu_length; + return FALSE; + } +/* advance SPM sequence only on successful transmission */ + sock->spm_sqn++; + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length); + return TRUE; +} + +/* send a NAK confirm (NCF) message with provided sequence number list. + * + * on success, TRUE is returned, returns FALSE if operation would block. + */ + +static +bool +send_ncf ( + pgm_sock_t* const restrict sock, + const struct sockaddr* const restrict nak_src_nla, + const struct sockaddr* const restrict nak_grp_nla, + const uint32_t sequence, + const bool is_parity /* send parity NCF */ + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != nak_src_nla); + pgm_assert (NULL != nak_grp_nla); + pgm_assert (nak_src_nla->sa_family == nak_grp_nla->sa_family); + +#ifdef SOURCE_DEBUG + char saddr[INET6_ADDRSTRLEN], gaddr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop (nak_src_nla, saddr, sizeof(saddr)); + pgm_sockaddr_ntop (nak_grp_nla, gaddr, sizeof(gaddr)); + pgm_debug ("send_ncf (sock:%p nak-src-nla:%s nak-grp-nla:%s sequence:%" PRIu32" is-parity:%s)", + (void*)sock, + saddr, + gaddr, + sequence, + is_parity ? "TRUE": "FALSE" + ); +#endif + + size_t tpdu_length = sizeof(struct pgm_header); + tpdu_length += (AF_INET == nak_src_nla->sa_family) ? sizeof(struct pgm_nak) : sizeof(struct pgm_nak6); + char buf[ tpdu_length ]; + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_nak* ncf = (struct pgm_nak *)(header + 1); + struct pgm_nak6* ncf6 = (struct pgm_nak6*)(header + 1); + memcpy (header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + header->pgm_sport = sock->tsi.sport; + header->pgm_dport = sock->dport; + header->pgm_type = PGM_NCF; + header->pgm_options = is_parity ? PGM_OPT_PARITY : 0; + header->pgm_tsdu_length = 0; + +/* NCF */ + ncf->nak_sqn = htonl (sequence); + +/* source nla */ + pgm_sockaddr_to_nla (nak_src_nla, (char*)&ncf->nak_src_nla_afi); + +/* group nla */ + pgm_sockaddr_to_nla (nak_grp_nla, (AF_INET6 == nak_src_nla->sa_family) ? (char*)&ncf6->nak6_grp_nla_afi : (char*)&ncf->nak_grp_nla_afi ); + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + + const ssize_t sent = pgm_sendto (sock, + FALSE, /* not rate limited */ + TRUE, /* with router alert */ + buf, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + if (sent < 0 && (EAGAIN == errno || ENOBUFS == errno)) + return FALSE; + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length); + return TRUE; +} + +/* A NCF packet with a OPT_NAK_LIST option extension + * + * on success, TRUE is returned. on error, FALSE is returned. + */ + +static +bool +send_ncf_list ( + pgm_sock_t* const restrict sock, + const struct sockaddr* const restrict nak_src_nla, + const struct sockaddr* const restrict nak_grp_nla, + struct pgm_sqn_list_t* const restrict sqn_list, /* will change to network-order */ + const bool is_parity /* send parity NCF */ + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != nak_src_nla); + pgm_assert (NULL != nak_grp_nla); + pgm_assert (sqn_list->len > 1); + pgm_assert (sqn_list->len <= 63); + pgm_assert (nak_src_nla->sa_family == nak_grp_nla->sa_family); + +#ifdef SOURCE_DEBUG + char saddr[INET6_ADDRSTRLEN], gaddr[INET6_ADDRSTRLEN]; + char list[1024]; + pgm_sockaddr_ntop (nak_src_nla, saddr, sizeof(saddr)); + pgm_sockaddr_ntop (nak_grp_nla, gaddr, sizeof(gaddr)); + sprintf (list, "%" PRIu32, sqn_list->sqn[0]); + for (uint_fast8_t i = 1; i < sqn_list->len; i++) { + char sequence[ 2 + strlen("4294967295") ]; + sprintf (sequence, " %" PRIu32, sqn_list->sqn[i]); + strcat (list, sequence); + } + pgm_debug ("send_ncf_list (sock:%p nak-src-nla:%s nak-grp-nla:%s sqn-list:[%s] is-parity:%s)", + (void*)sock, + saddr, + gaddr, + list, + is_parity ? "TRUE": "FALSE" + ); +#endif + + size_t tpdu_length = sizeof(struct pgm_header) + + sizeof(struct pgm_opt_length) + /* includes header */ + sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_nak_list) + + ( (sqn_list->len-1) * sizeof(uint32_t) ); + tpdu_length += (AF_INET == nak_src_nla->sa_family) ? sizeof(struct pgm_nak) : sizeof(struct pgm_nak6); + char buf[ tpdu_length ]; + struct pgm_header* header = (struct pgm_header*)buf; + struct pgm_nak* ncf = (struct pgm_nak *)(header + 1); + struct pgm_nak6* ncf6 = (struct pgm_nak6*)(header + 1); + memcpy (header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + header->pgm_sport = sock->tsi.sport; + header->pgm_dport = sock->dport; + header->pgm_type = PGM_NCF; + header->pgm_options = is_parity ? (PGM_OPT_PRESENT | PGM_OPT_NETWORK | PGM_OPT_PARITY) : (PGM_OPT_PRESENT | PGM_OPT_NETWORK); + header->pgm_tsdu_length = 0; +/* NCF */ + ncf->nak_sqn = htonl (sqn_list->sqn[0]); + +/* source nla */ + pgm_sockaddr_to_nla (nak_src_nla, (char*)&ncf->nak_src_nla_afi); + +/* group nla */ + pgm_sockaddr_to_nla (nak_grp_nla, (AF_INET6 == nak_src_nla->sa_family) ? (char*)&ncf6->nak6_grp_nla_afi : (char*)&ncf->nak_grp_nla_afi ); + +/* OPT_NAK_LIST */ + struct pgm_opt_length* opt_len = (AF_INET6 == nak_src_nla->sa_family) ? (struct pgm_opt_length*)(ncf6 + 1) : (struct pgm_opt_length*)(ncf + 1); + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); + opt_len->opt_total_length = htons ( sizeof(struct pgm_opt_length) + + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_nak_list) + + ( (sqn_list->len-1) * sizeof(uint32_t) ) ); + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_NAK_LIST | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_nak_list) + + ( (sqn_list->len-1) * sizeof(uint32_t) ); + struct pgm_opt_nak_list* opt_nak_list = (struct pgm_opt_nak_list*)(opt_header + 1); + opt_nak_list->opt_reserved = 0; +/* to network-order */ + for (uint_fast8_t i = 1; i < sqn_list->len; i++) + opt_nak_list->opt_sqn[i-1] = htonl (sqn_list->sqn[i]); + + header->pgm_checksum = 0; + header->pgm_checksum = pgm_csum_fold (pgm_csum_partial (buf, tpdu_length, 0)); + + const ssize_t sent = pgm_sendto (sock, + FALSE, /* not rate limited */ + TRUE, /* with router alert */ + buf, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + if (sent < 0 && (EAGAIN == errno || ENOBUFS == errno)) + return FALSE; + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length); + return TRUE; +} + +/* cancel any pending heartbeat SPM and schedule a new one + */ + +static +void +reset_heartbeat_spm ( + pgm_sock_t*const sock, + const pgm_time_t now + ) +{ + pgm_mutex_lock (&sock->timer_mutex); + const pgm_time_t next_poll = sock->next_poll; + const pgm_time_t spm_heartbeat_interval = sock->spm_heartbeat_interval[ sock->spm_heartbeat_state = 1 ]; + sock->next_heartbeat_spm = now + spm_heartbeat_interval; + if (pgm_time_after( next_poll, sock->next_heartbeat_spm )) + { + sock->next_poll = sock->next_heartbeat_spm; + if (!sock->is_pending_read) { + pgm_notify_send (&sock->pending_notify); + sock->is_pending_read = TRUE; + } + } + pgm_mutex_unlock (&sock->timer_mutex); +} + +/* state helper for resuming sends + */ +#define STATE(x) (sock->pkt_dontwait_state.x) + +/* send one PGM data packet, transmit window owned memory. + * + * On success, returns PGM_IO_STATUS_NORMAL and the number of data bytes pushed + * into the transmit window and attempted to send to the socket layer is saved + * into bytes_written. On non-blocking sockets, PGM_IO_STATUS_WOULD_BLOCK is + * returned if the send would block. PGM_IO_STATUS_RATE_LIMITED is returned if + * the packet sizes would exceed the current rate limit. + * + * ! always returns successful if data is pushed into the transmit window, even if + * sendto() double fails ¡ we don't want the application to try again as that is the + * reliable socks role. + */ + +static +int +send_odata ( + pgm_sock_t* const restrict sock, + struct pgm_sk_buff_t* const restrict skb, + size_t* restrict bytes_written + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != skb); + pgm_assert (skb->len <= sock->max_tsdu); + + pgm_debug ("send_odata (sock:%p skb:%p bytes-written:%p)", + (void*)sock, (void*)skb, (void*)bytes_written); + + const uint16_t tsdu_length = skb->len; + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + const size_t tpdu_length = tsdu_length + pgm_pkt_offset (FALSE, pgmcc_family); + +/* continue if send would block */ + if (sock->is_apdu_eagain) { + STATE(skb)->tstamp = pgm_time_update_now(); + goto retry_send; + } + +/* add PGM header to skbuff */ + STATE(skb) = pgm_skb_get(skb); + STATE(skb)->sock = sock; + STATE(skb)->tstamp = pgm_time_update_now(); + + STATE(skb)->pgm_header = (struct pgm_header*)STATE(skb)->head; + STATE(skb)->pgm_data = (struct pgm_data*)(STATE(skb)->pgm_header + 1); + memcpy (STATE(skb)->pgm_header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + STATE(skb)->pgm_header->pgm_sport = sock->tsi.sport; + STATE(skb)->pgm_header->pgm_dport = sock->dport; + STATE(skb)->pgm_header->pgm_type = PGM_ODATA; + STATE(skb)->pgm_header->pgm_options = sock->use_pgmcc ? PGM_OPT_PRESENT : 0; + STATE(skb)->pgm_header->pgm_tsdu_length = htons (tsdu_length); + +/* ODATA */ + STATE(skb)->pgm_data->data_sqn = htonl (pgm_txw_next_lead(sock->window)); + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + + STATE(skb)->pgm_header->pgm_checksum = 0; + void* data = STATE(skb)->pgm_data + 1; + if (sock->use_pgmcc) { + struct pgm_opt_length* opt_len = data; + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); + opt_len->opt_total_length = htons ( sizeof(struct pgm_opt_length) + + sizeof(struct pgm_opt_header) + + ((AF_INET6 == sock->acker_nla.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_data) : + sizeof(struct pgm_opt_pgmcc_data)) ); + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_PGMCC_DATA | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + ((AF_INET6 == sock->acker_nla.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_data) : + sizeof(struct pgm_opt_pgmcc_data)); + struct pgm_opt_pgmcc_data* pgmcc_data = (struct pgm_opt_pgmcc_data*)(opt_header + 1); + struct pgm_opt6_pgmcc_data* pgmcc_data6 = (struct pgm_opt6_pgmcc_data*)(opt_header + 1); + + pgmcc_data->opt_tstamp = htonl (pgm_to_msecs (STATE(skb)->tstamp)); +/* acker nla */ + pgm_sockaddr_to_nla ((struct sockaddr*)&sock->acker_nla, (char*)&pgmcc_data->opt_nla_afi); + if (AF_INET6 == sock->acker_nla.ss_family) + data = (char*)pgmcc_data6 + sizeof(struct pgm_opt6_pgmcc_data); + else + data = (char*)pgmcc_data + sizeof(struct pgm_opt_pgmcc_data); + } + const size_t pgm_header_len = (char*)data - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + STATE(unfolded_odata) = pgm_csum_partial (data, tsdu_length, 0); + STATE(skb)->pgm_header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, STATE(unfolded_odata), pgm_header_len)); + +/* add to transmit window, skb::data set to payload */ + pgm_spinlock_lock (&sock->txw_spinlock); + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + +/* the transmit window MUST check the user count to ensure it does not + * attempt to send a repair-data packet based on in transit original data. + */ + + ssize_t sent; +retry_send: + +/* congestion control */ + if (sock->use_pgmcc && + sock->tokens < pgm_fp8 (1)) + { +// pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("Token limit reached.")); + sock->is_apdu_eagain = TRUE; + sock->blocklen = tpdu_length; + return PGM_IO_STATUS_CONGESTION; /* peer expiration to re-elect ACKer */ + } + + sent = pgm_sendto (sock, + sock->is_controlled_odata, /* rate limited */ + FALSE, /* regular socket */ + STATE(skb)->head, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + if (sent < 0 && (EAGAIN == errno || ENOBUFS == errno)) { + sock->is_apdu_eagain = TRUE; + sock->blocklen = tpdu_length; + if (EAGAIN == errno) { + if (sock->use_pgmcc) + pgm_notify_clear (&sock->ack_notify); + return PGM_IO_STATUS_WOULD_BLOCK; + } + return PGM_IO_STATUS_RATE_LIMITED; + } + +/* save unfolded odata for retransmissions */ + pgm_txw_set_unfolded_checksum (STATE(skb), STATE(unfolded_odata)); + + sock->is_apdu_eagain = FALSE; + reset_heartbeat_spm (sock, STATE(skb)->tstamp); + if (sock->use_pgmcc) { + sock->tokens -= pgm_fp8 (1); + sock->ack_expiry = STATE(skb)->tstamp + sock->ack_expiry_ivl; + } + + if (PGM_LIKELY((size_t)sent == tpdu_length)) { + sock->cumulative_stats[PGM_PC_SOURCE_DATA_BYTES_SENT] += tsdu_length; + sock->cumulative_stats[PGM_PC_SOURCE_DATA_MSGS_SENT] ++; + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length + sock->iphdr_len); + } + +/* check for end of transmission group */ + if (sock->use_proactive_parity) { + const uint32_t odata_sqn = ntohl (STATE(skb)->pgm_data->data_sqn); + const uint32_t tg_sqn_mask = 0xffffffff << sock->tg_sqn_shift; + if (!((odata_sqn + 1) & ~tg_sqn_mask)) + pgm_schedule_proactive_nak (sock, odata_sqn & tg_sqn_mask); + } + +/* remove applications reference to skbuff */ + pgm_free_skb (STATE(skb)); + if (bytes_written) + *bytes_written = tsdu_length; + return PGM_IO_STATUS_NORMAL; +} + +/* send one PGM original data packet, callee owned memory. + * + * on success, returns PGM_IO_STATUS_NORMAL, on block for non-blocking sockets + * returns PGM_IO_STATUS_WOULD_BLOCK, returns PGM_IO_STATUS_RATE_LIMITED if + * packet size exceeds the current rate limit. + */ + +static +int +send_odata_copy ( + pgm_sock_t* const restrict sock, + const void* restrict tsdu, + const uint16_t tsdu_length, + size_t* restrict bytes_written + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (tsdu_length <= sock->max_tsdu); + if (PGM_LIKELY(tsdu_length)) pgm_assert (NULL != tsdu); + + pgm_debug ("send_odata_copy (sock:%p tsdu:%p tsdu_length:%u bytes-written:%p)", + (void*)sock, tsdu, tsdu_length, (void*)bytes_written); + + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + const size_t tpdu_length = tsdu_length + pgm_pkt_offset (FALSE, pgmcc_family); + +/* continue if blocked mid-apdu, updating timestamp */ + if (sock->is_apdu_eagain) { + STATE(skb)->tstamp = pgm_time_update_now(); + goto retry_send; + } + + STATE(skb) = pgm_alloc_skb (sock->max_tpdu); + STATE(skb)->sock = sock; + STATE(skb)->tstamp = pgm_time_update_now(); + pgm_skb_reserve (STATE(skb), pgm_pkt_offset (FALSE, pgmcc_family)); + pgm_skb_put (STATE(skb), tsdu_length); + + STATE(skb)->pgm_header = (struct pgm_header*)STATE(skb)->head; + STATE(skb)->pgm_data = (struct pgm_data*)(STATE(skb)->pgm_header + 1); + memcpy (STATE(skb)->pgm_header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + STATE(skb)->pgm_header->pgm_sport = sock->tsi.sport; + STATE(skb)->pgm_header->pgm_dport = sock->dport; + STATE(skb)->pgm_header->pgm_type = PGM_ODATA; + STATE(skb)->pgm_header->pgm_options = sock->use_pgmcc ? PGM_OPT_PRESENT : 0; + STATE(skb)->pgm_header->pgm_tsdu_length = htons (tsdu_length); + +/* ODATA */ + STATE(skb)->pgm_data->data_sqn = htonl (pgm_txw_next_lead(sock->window)); + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + + STATE(skb)->pgm_header->pgm_checksum = 0; + void* data = STATE(skb)->pgm_data + 1; + if (sock->use_pgmcc) { + struct pgm_opt_length* opt_len = data; + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); + opt_len->opt_total_length = htons ( sizeof(struct pgm_opt_length) + + sizeof(struct pgm_opt_header) + + ((AF_INET6 == sock->acker_nla.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_data) : + sizeof(struct pgm_opt_pgmcc_data)) ); + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_PGMCC_DATA | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + ((AF_INET6 == sock->acker_nla.ss_family) ? + sizeof(struct pgm_opt6_pgmcc_data) : + sizeof(struct pgm_opt_pgmcc_data)); + struct pgm_opt_pgmcc_data* pgmcc_data = (struct pgm_opt_pgmcc_data*)(opt_header + 1); +/* unused */ +// struct pgm_opt6_pgmcc_data* pgmcc_data6 = (struct pgm_opt6_pgmcc_data*)(opt_header + 1); + + pgmcc_data->opt_reserved = 0; + pgmcc_data->opt_tstamp = htonl (pgm_to_msecs (STATE(skb)->tstamp)); +/* acker nla */ + pgm_sockaddr_to_nla ((struct sockaddr*)&sock->acker_nla, (char*)&pgmcc_data->opt_nla_afi); + data = (char*)opt_header + opt_header->opt_length; + } + const size_t pgm_header_len = (char*)data - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + STATE(unfolded_odata) = pgm_csum_partial_copy (tsdu, data, tsdu_length, 0); + STATE(skb)->pgm_header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, STATE(unfolded_odata), pgm_header_len)); + +/* add to transmit window, skb::data set to payload */ + pgm_spinlock_lock (&sock->txw_spinlock); + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + + ssize_t sent; +retry_send: + +/* congestion control */ + if (sock->use_pgmcc && + sock->tokens < pgm_fp8 (1)) + { +// pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("Token limit reached.")); + sock->is_apdu_eagain = TRUE; + sock->blocklen = tpdu_length; + return PGM_IO_STATUS_CONGESTION; + } + + sent = pgm_sendto (sock, + sock->is_controlled_odata, /* rate limited */ + FALSE, /* regular socket */ + STATE(skb)->head, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + if (sent < 0 && (EAGAIN == errno || ENOBUFS == errno)) { + sock->is_apdu_eagain = TRUE; + sock->blocklen = tpdu_length; + if (EAGAIN == errno) { + if (sock->use_pgmcc) + pgm_notify_clear (&sock->ack_notify); + return PGM_IO_STATUS_WOULD_BLOCK; + } + return PGM_IO_STATUS_RATE_LIMITED; + } + + if (sock->use_pgmcc) { + sock->tokens -= pgm_fp8 (1); + pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("PGMCC tokens-- (T:%u W:%u)"), + pgm_fp8tou (sock->tokens), pgm_fp8tou (sock->cwnd_size)); + sock->ack_expiry = STATE(skb)->tstamp + sock->ack_expiry_ivl; + } + +/* save unfolded odata for retransmissions */ + pgm_txw_set_unfolded_checksum (STATE(skb), STATE(unfolded_odata)); + + sock->is_apdu_eagain = FALSE; + reset_heartbeat_spm (sock, STATE(skb)->tstamp); + + if (PGM_LIKELY((size_t)sent == tpdu_length)) { + sock->cumulative_stats[PGM_PC_SOURCE_DATA_BYTES_SENT] += tsdu_length; + sock->cumulative_stats[PGM_PC_SOURCE_DATA_MSGS_SENT] ++; + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length + sock->iphdr_len); + } + +/* check for end of transmission group */ + if (sock->use_proactive_parity) { + const uint32_t odata_sqn = ntohl (STATE(skb)->pgm_data->data_sqn); + const uint32_t tg_sqn_mask = 0xffffffff << sock->tg_sqn_shift; + if (!((odata_sqn + 1) & ~tg_sqn_mask)) + pgm_schedule_proactive_nak (sock, odata_sqn & tg_sqn_mask); + } + +/* return data payload length sent */ + if (bytes_written) + *bytes_written = tsdu_length; + return PGM_IO_STATUS_NORMAL; +} + +/* send one PGM original data packet, callee owned scatter/gather io vector + * + * ⎢ DATA₀ ⎢ + * ⎢ DATA₁ ⎢ → send_odatav() → ⎢ TSDU₀ ⎢ → libc + * ⎢ ⋮ ⎢ + * + * on success, returns PGM_IO_STATUS_NORMAL, on block for non-blocking sockets + * returns PGM_IO_STATUS_WOULD_BLOCK, returns PGM_IO_STATUS_RATE_LIMITED if + * packet size exceeds the current rate limit. + */ + +static +int +send_odatav ( + pgm_sock_t* const restrict sock, + const struct pgm_iovec* const restrict vector, + const unsigned count, /* number of items in vector */ + size_t* restrict bytes_written + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (count <= PGM_MAX_FRAGMENTS); + if (PGM_LIKELY(count)) pgm_assert (NULL != vector); + + pgm_debug ("send_odatav (sock:%p vector:%p count:%u bytes-written:%p)", + (const void*)sock, (const void*)vector, count, (const void*)bytes_written); + + if (PGM_UNLIKELY(0 == count)) + return send_odata_copy (sock, NULL, 0, bytes_written); + +/* continue if blocked on send */ + if (sock->is_apdu_eagain) + goto retry_send; + + STATE(tsdu_length) = 0; + for (unsigned i = 0; i < count; i++) + { +#ifdef TRANSPORT_DEBUG + if (PGM_LIKELY(vector[i].iov_len)) { + pgm_assert( vector[i].iov_base ); + } +#endif + STATE(tsdu_length) += vector[i].iov_len; + } + pgm_return_val_if_fail (STATE(tsdu_length) <= sock->max_tsdu, PGM_IO_STATUS_ERROR); + + STATE(skb) = pgm_alloc_skb (sock->max_tpdu); + STATE(skb)->sock = sock; + STATE(skb)->tstamp = pgm_time_update_now(); + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + pgm_skb_reserve (STATE(skb), pgm_pkt_offset (FALSE, pgmcc_family)); + pgm_skb_put (STATE(skb), STATE(tsdu_length)); + + STATE(skb)->pgm_header = (struct pgm_header*)STATE(skb)->data; + STATE(skb)->pgm_data = (struct pgm_data*)(STATE(skb)->pgm_header + 1); + memcpy (STATE(skb)->pgm_header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + STATE(skb)->pgm_header->pgm_sport = sock->tsi.sport; + STATE(skb)->pgm_header->pgm_dport = sock->dport; + STATE(skb)->pgm_header->pgm_type = PGM_ODATA; + STATE(skb)->pgm_header->pgm_options = 0; + STATE(skb)->pgm_header->pgm_tsdu_length = htons (STATE(tsdu_length)); + +/* ODATA */ + STATE(skb)->pgm_data->data_sqn = htonl (pgm_txw_next_lead(sock->window)); + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + + STATE(skb)->pgm_header->pgm_checksum = 0; + const size_t pgm_header_len = (char*)(STATE(skb)->pgm_data + 1) - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + +/* unroll first iteration to make friendly branch prediction */ + char* dst = (char*)(STATE(skb)->pgm_data + 1); + STATE(unfolded_odata) = pgm_csum_partial_copy ((const char*)vector[0].iov_base, dst, vector[0].iov_len, 0); + +/* iterate over one or more vector elements to perform scatter/gather checksum & copy */ + for (unsigned i = 1; i < count; i++) { + dst += vector[i-1].iov_len; + const uint32_t unfolded_element = pgm_csum_partial_copy ((const char*)vector[i].iov_base, dst, vector[i].iov_len, 0); + STATE(unfolded_odata) = pgm_csum_block_add (STATE(unfolded_odata), unfolded_element, vector[i-1].iov_len); + } + + STATE(skb)->pgm_header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, STATE(unfolded_odata), pgm_header_len)); + +/* add to transmit window, skb::data set to payload */ + pgm_spinlock_lock (&sock->txw_spinlock); + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + + ssize_t sent; + size_t tpdu_length; +retry_send: + pgm_assert ((char*)STATE(skb)->tail > (char*)STATE(skb)->head); + tpdu_length = (char*)STATE(skb)->tail - (char*)STATE(skb)->head; + sent = pgm_sendto (sock, + sock->is_controlled_odata, /* rate limited */ + FALSE, /* regular socket */ + STATE(skb)->head, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + if (sent < 0 && (EAGAIN == errno || ENOBUFS == errno)) { + sock->is_apdu_eagain = TRUE; + sock->blocklen = tpdu_length; + if (EAGAIN == errno) { + if (sock->use_pgmcc) + pgm_notify_clear (&sock->ack_notify); + return PGM_IO_STATUS_WOULD_BLOCK; + } + return PGM_IO_STATUS_RATE_LIMITED; + } + +/* save unfolded odata for retransmissions */ + pgm_txw_set_unfolded_checksum (STATE(skb), STATE(unfolded_odata)); + + sock->is_apdu_eagain = FALSE; + reset_heartbeat_spm (sock, STATE(skb)->tstamp); + + if (PGM_LIKELY((size_t)sent == STATE(skb)->len)) { + sock->cumulative_stats[PGM_PC_SOURCE_DATA_BYTES_SENT] += STATE(tsdu_length); + sock->cumulative_stats[PGM_PC_SOURCE_DATA_MSGS_SENT] ++; + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length + sock->iphdr_len); + } + +/* check for end of transmission group */ + if (sock->use_proactive_parity) { + const uint32_t odata_sqn = ntohl (STATE(skb)->pgm_data->data_sqn); + const uint32_t tg_sqn_mask = 0xffffffff << sock->tg_sqn_shift; + if (!((odata_sqn + 1) & ~tg_sqn_mask)) + pgm_schedule_proactive_nak (sock, odata_sqn & tg_sqn_mask); + } + +/* return data payload length sent */ + if (bytes_written) + *bytes_written = STATE(tsdu_length); + return PGM_IO_STATUS_NORMAL; +} + +/* send PGM original data, callee owned memory. if larger than maximum TPDU + * size will be fragmented. + * + * on success, returns PGM_IO_STATUS_NORMAL, on block for non-blocking sockets + * returns PGM_IO_STATUS_WOULD_BLOCK, returns PGM_IO_STATUS_RATE_LIMITED if + * packet size exceeds the current rate limit. + */ + +static +int +send_apdu ( + pgm_sock_t* const restrict sock, + const void* restrict apdu, + const size_t apdu_length, + size_t* restrict bytes_written + ) +{ + size_t bytes_sent = 0; /* counted at IP layer */ + unsigned packets_sent = 0; /* IP packets */ + size_t data_bytes_sent = 0; + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + + pgm_assert (NULL != sock); + pgm_assert (NULL != apdu); + +/* continue if blocked mid-apdu */ + if (sock->is_apdu_eagain) + goto retry_send; + +/* if non-blocking calculate total wire size and check rate limit */ + STATE(is_rate_limited) = FALSE; + if (sock->is_nonblocking && sock->is_controlled_odata) + { + const size_t header_length = pgm_pkt_offset (TRUE, pgmcc_family); + size_t tpdu_length = 0; + size_t offset_ = 0; + do { + const uint16_t tsdu_length = MIN( source_max_tsdu (sock, TRUE), apdu_length - offset_ ); + tpdu_length += sock->iphdr_len + header_length + tsdu_length; + offset_ += tsdu_length; + } while (offset_ < apdu_length); + +/* calculation includes one iphdr length already */ + if (!pgm_rate_check (&sock->rate_control, + tpdu_length - sock->iphdr_len, + sock->is_nonblocking)) + { + sock->blocklen = tpdu_length; + return PGM_IO_STATUS_RATE_LIMITED; + } + STATE(is_rate_limited) = TRUE; + } + + STATE(data_bytes_offset) = 0; + STATE(first_sqn) = pgm_txw_next_lead(sock->window); + + do { +/* retrieve packet storage from transmit window */ + size_t header_length = pgm_pkt_offset (TRUE, pgmcc_family); + STATE(tsdu_length) = MIN( source_max_tsdu (sock, TRUE), apdu_length - STATE(data_bytes_offset) ); + + STATE(skb) = pgm_alloc_skb (sock->max_tpdu); + STATE(skb)->sock = sock; + STATE(skb)->tstamp = pgm_time_update_now(); + pgm_skb_reserve (STATE(skb), header_length); + pgm_skb_put (STATE(skb), STATE(tsdu_length)); + + STATE(skb)->pgm_header = (struct pgm_header*)STATE(skb)->head; + STATE(skb)->pgm_data = (struct pgm_data*)(STATE(skb)->pgm_header + 1); + memcpy (STATE(skb)->pgm_header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + STATE(skb)->pgm_header->pgm_sport = sock->tsi.sport; + STATE(skb)->pgm_header->pgm_dport = sock->dport; + STATE(skb)->pgm_header->pgm_type = PGM_ODATA; + STATE(skb)->pgm_header->pgm_options = PGM_OPT_PRESENT; + STATE(skb)->pgm_header->pgm_tsdu_length = htons (STATE(tsdu_length)); + +/* ODATA */ + STATE(skb)->pgm_data->data_sqn = htonl (pgm_txw_next_lead(sock->window)); + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + +/* OPT_LENGTH */ + struct pgm_opt_length* opt_len = (struct pgm_opt_length*)(STATE(skb)->pgm_data + 1); + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); + opt_len->opt_total_length = htons ( sizeof(struct pgm_opt_length) + + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment) ); +/* OPT_FRAGMENT */ + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_FRAGMENT | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment); + STATE(skb)->pgm_opt_fragment = (struct pgm_opt_fragment*)(opt_header + 1); + STATE(skb)->pgm_opt_fragment->opt_reserved = 0; + STATE(skb)->pgm_opt_fragment->opt_sqn = htonl (STATE(first_sqn)); + STATE(skb)->pgm_opt_fragment->opt_frag_off = htonl (STATE(data_bytes_offset)); + STATE(skb)->pgm_opt_fragment->opt_frag_len = htonl (apdu_length); + +/* TODO: the assembly checksum & copy routine is faster than memcpy & pgm_cksum on >= opteron hardware */ + STATE(skb)->pgm_header->pgm_checksum = 0; + const size_t pgm_header_len = (char*)(STATE(skb)->pgm_opt_fragment + 1) - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + STATE(unfolded_odata) = pgm_csum_partial_copy ((const char*)apdu + STATE(data_bytes_offset), STATE(skb)->pgm_opt_fragment + 1, STATE(tsdu_length), 0); + STATE(skb)->pgm_header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, STATE(unfolded_odata), pgm_header_len)); + +/* add to transmit window, skb::data set to payload */ + pgm_spinlock_lock (&sock->txw_spinlock); + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + + ssize_t sent; + size_t tpdu_length; +retry_send: + pgm_assert ((char*)STATE(skb)->tail > (char*)STATE(skb)->head); + tpdu_length = (char*)STATE(skb)->tail - (char*)STATE(skb)->head; + sent = pgm_sendto (sock, + !STATE(is_rate_limited), /* rate limit on blocking */ + FALSE, /* regular socket */ + STATE(skb)->head, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + if (sent < 0 && (EAGAIN == errno || ENOBUFS == errno)) { + sock->is_apdu_eagain = TRUE; + sock->blocklen = tpdu_length; + goto blocked; + } + +/* save unfolded odata for retransmissions */ + pgm_txw_set_unfolded_checksum (STATE(skb), STATE(unfolded_odata)); + + if (PGM_LIKELY((size_t)sent == tpdu_length)) { + bytes_sent += tpdu_length + sock->iphdr_len; /* as counted at IP layer */ + packets_sent++; /* IP packets */ + data_bytes_sent += STATE(tsdu_length); + } + + STATE(data_bytes_offset) += STATE(tsdu_length); + +/* check for end of transmission group */ + if (sock->use_proactive_parity) { + const uint32_t odata_sqn = ntohl (STATE(skb)->pgm_data->data_sqn); + const uint32_t tg_sqn_mask = 0xffffffff << sock->tg_sqn_shift; + if (!((odata_sqn + 1) & ~tg_sqn_mask)) + pgm_schedule_proactive_nak (sock, odata_sqn & tg_sqn_mask); + } + + } while ( STATE(data_bytes_offset) < apdu_length); + pgm_assert( STATE(data_bytes_offset) == apdu_length ); + + sock->is_apdu_eagain = FALSE; + reset_heartbeat_spm (sock, STATE(skb)->tstamp); + + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], bytes_sent); + sock->cumulative_stats[PGM_PC_SOURCE_DATA_MSGS_SENT] += packets_sent; + sock->cumulative_stats[PGM_PC_SOURCE_DATA_BYTES_SENT] += data_bytes_sent; + if (bytes_written) + *bytes_written = apdu_length; + return PGM_IO_STATUS_NORMAL; + +blocked: + if (bytes_sent) { + reset_heartbeat_spm (sock, STATE(skb)->tstamp); + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], bytes_sent); + sock->cumulative_stats[PGM_PC_SOURCE_DATA_MSGS_SENT] += packets_sent; + sock->cumulative_stats[PGM_PC_SOURCE_DATA_BYTES_SENT] += data_bytes_sent; + } + if (EAGAIN == errno) { + if (sock->use_pgmcc) + pgm_notify_clear (&sock->ack_notify); + return PGM_IO_STATUS_WOULD_BLOCK; + } + return PGM_IO_STATUS_RATE_LIMITED; +} + +/* Send one APDU, whether it fits within one TPDU or more. + * + * on success, returns PGM_IO_STATUS_NORMAL, on block for non-blocking sockets + * returns PGM_IO_STATUS_WOULD_BLOCK, returns PGM_IO_STATUS_RATE_LIMITED if + * packet size exceeds the current rate limit. + */ +int +pgm_send ( + pgm_sock_t* const restrict sock, + const void* restrict apdu, + const size_t apdu_length, + size_t* restrict bytes_written + ) +{ + pgm_debug ("pgm_send (sock:%p apdu:%p apdu-length:%zu bytes-written:%p)", + (void*)sock, apdu, apdu_length, (void*)bytes_written); + +/* parameters */ + pgm_return_val_if_fail (NULL != sock, PGM_IO_STATUS_ERROR); + if (PGM_LIKELY(apdu_length)) pgm_return_val_if_fail (NULL != apdu, PGM_IO_STATUS_ERROR); + +/* shutdown */ + if (PGM_UNLIKELY(!pgm_rwlock_reader_trylock (&sock->lock))) + pgm_return_val_if_reached (PGM_IO_STATUS_ERROR); + +/* state */ + if (PGM_UNLIKELY(!sock->is_bound || + sock->is_destroyed || + apdu_length > sock->max_apdu)) + { + pgm_rwlock_reader_unlock (&sock->lock); + pgm_return_val_if_reached (PGM_IO_STATUS_ERROR); + } + +/* source */ + pgm_mutex_lock (&sock->source_mutex); + +/* pass on non-fragment calls */ + if (apdu_length <= sock->max_tsdu) + { + const int status = send_odata_copy (sock, apdu, apdu_length, bytes_written); + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; + } + + const int status = send_apdu (sock, apdu, apdu_length, bytes_written); + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; +} + +/* send PGM original data, callee owned scatter/gather IO vector. if larger than maximum TPDU + * size will be fragmented. + * + * is_one_apdu = true: + * + * ⎢ DATA₀ ⎢ + * ⎢ DATA₁ ⎢ → pgm_sendv() → ⎢ ⋯ TSDU₁ TSDU₀ ⎢ → libc + * ⎢ ⋮ ⎢ + * + * is_one_apdu = false: + * + * ⎢ APDU₀ ⎢ ⎢ ⋯ TSDU₁,₀ TSDU₀,₀ ⎢ + * ⎢ APDU₁ ⎢ → pgm_sendv() → ⎢ ⋯ TSDU₁,₁ TSDU₀,₁ ⎢ → libc + * ⎢ ⋮ ⎢ ⎢ ⋮ ⋮ ⎢ + * + * on success, returns PGM_IO_STATUS_NORMAL, on block for non-blocking sockets + * returns PGM_IO_STATUS_WOULD_BLOCK, returns PGM_IO_STATUS_RATE_LIMITED if + * packet size exceeds the current rate limit. + */ + +int +pgm_sendv ( + pgm_sock_t* const restrict sock, + const struct pgm_iovec* const restrict vector, + const unsigned count, /* number of items in vector */ + const bool is_one_apdu, /* true = vector = apdu, false = vector::iov_base = apdu */ + size_t* restrict bytes_written + ) +{ + pgm_debug ("pgm_sendv (sock:%p vector:%p count:%u is-one-apdu:%s bytes-written:%p)", + (const void*)sock, + (const void*)vector, + count, + is_one_apdu ? "TRUE" : "FALSE", + (const void*)bytes_written); + + pgm_return_val_if_fail (NULL != sock, PGM_IO_STATUS_ERROR); + pgm_return_val_if_fail (count <= PGM_MAX_FRAGMENTS, PGM_IO_STATUS_ERROR); + if (PGM_LIKELY(count)) pgm_return_val_if_fail (NULL != vector, PGM_IO_STATUS_ERROR); + if (PGM_UNLIKELY(!pgm_rwlock_reader_trylock (&sock->lock))) + pgm_return_val_if_reached (PGM_IO_STATUS_ERROR); + if (PGM_UNLIKELY(!sock->is_bound || + sock->is_destroyed)) + { + pgm_rwlock_reader_unlock (&sock->lock); + pgm_return_val_if_reached (PGM_IO_STATUS_ERROR); + } + + pgm_mutex_lock (&sock->source_mutex); + +/* pass on zero length as cannot count vector lengths */ + if (PGM_UNLIKELY(0 == count)) + { + const int status = send_odata_copy (sock, NULL, count, bytes_written); + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; + } + + size_t bytes_sent = 0; + unsigned packets_sent = 0; + size_t data_bytes_sent = 0; + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + +/* continue if blocked mid-apdu */ + if (sock->is_apdu_eagain) { + if (is_one_apdu) { + if (STATE(apdu_length) <= sock->max_tsdu) + { + const int status = send_odatav (sock, vector, count, bytes_written); + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; + } + else + goto retry_one_apdu_send; + } else { + goto retry_send; + } + } + +/* calculate (total) APDU length */ + STATE(apdu_length) = 0; + for (unsigned i = 0; i < count; i++) + { +#ifdef TRANSPORT_DEBUG + if (PGM_LIKELY(vector[i].iov_len)) { + pgm_assert( vector[i].iov_base ); + } +#endif + if (!is_one_apdu && + vector[i].iov_len > sock->max_apdu) + { + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + pgm_return_val_if_reached (PGM_IO_STATUS_ERROR); + } + STATE(apdu_length) += vector[i].iov_len; + } + +/* pass on non-fragment calls */ + if (is_one_apdu) { + if (STATE(apdu_length) <= sock->max_tsdu) { + const int status = send_odatav (sock, vector, count, bytes_written); + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; + } else if (STATE(apdu_length) > sock->max_apdu) { + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + pgm_return_val_if_reached (PGM_IO_STATUS_ERROR); + } + } + +/* if non-blocking calculate total wire size and check rate limit */ + STATE(is_rate_limited) = FALSE; + if (sock->is_nonblocking && sock->is_controlled_odata) + { + const size_t header_length = pgm_pkt_offset (TRUE, pgmcc_family); + size_t tpdu_length = 0; + size_t offset_ = 0; + do { + const uint16_t tsdu_length = MIN( source_max_tsdu (sock, TRUE), STATE(apdu_length) - offset_ ); + tpdu_length += sock->iphdr_len + header_length + tsdu_length; + offset_ += tsdu_length; + } while (offset_ < STATE(apdu_length)); + +/* calculation includes one iphdr length already */ + if (!pgm_rate_check (&sock->rate_control, + tpdu_length - sock->iphdr_len, + sock->is_nonblocking)) + { + sock->blocklen = tpdu_length; + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_RATE_LIMITED; + } + STATE(is_rate_limited) = TRUE; + } + +/* non-fragmented packets can be forwarded onto basic send() */ + if (!is_one_apdu) + { + for (STATE(data_pkt_offset) = 0; STATE(data_pkt_offset) < count; STATE(data_pkt_offset)++) + { + size_t wrote_bytes; + int status; +retry_send: + status = send_apdu (sock, + vector[STATE(data_pkt_offset)].iov_base, + vector[STATE(data_pkt_offset)].iov_len, + &wrote_bytes); + switch (status) { + case PGM_IO_STATUS_NORMAL: + break; + case PGM_IO_STATUS_WOULD_BLOCK: + case PGM_IO_STATUS_RATE_LIMITED: + sock->is_apdu_eagain = TRUE; + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; + case PGM_IO_STATUS_ERROR: + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; + default: + pgm_assert_not_reached(); + } + data_bytes_sent += wrote_bytes; + } + + sock->is_apdu_eagain = FALSE; + if (bytes_written) + *bytes_written = data_bytes_sent; + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_NORMAL; + } + + STATE(data_bytes_offset) = 0; + STATE(vector_index) = 0; + STATE(vector_offset) = 0; + + STATE(first_sqn) = pgm_txw_next_lead(sock->window); + + do { +/* retrieve packet storage from transmit window */ + size_t header_length = pgm_pkt_offset (TRUE, pgmcc_family); + STATE(tsdu_length) = MIN( source_max_tsdu (sock, TRUE), STATE(apdu_length) - STATE(data_bytes_offset) ); + STATE(skb) = pgm_alloc_skb (sock->max_tpdu); + STATE(skb)->sock = sock; + STATE(skb)->tstamp = pgm_time_update_now(); + pgm_skb_reserve (STATE(skb), header_length); + pgm_skb_put (STATE(skb), STATE(tsdu_length)); + + STATE(skb)->pgm_header = (struct pgm_header*)STATE(skb)->head; + STATE(skb)->pgm_data = (struct pgm_data*)(STATE(skb)->pgm_header + 1); + memcpy (STATE(skb)->pgm_header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + STATE(skb)->pgm_header->pgm_sport = sock->tsi.sport; + STATE(skb)->pgm_header->pgm_dport = sock->dport; + STATE(skb)->pgm_header->pgm_type = PGM_ODATA; + STATE(skb)->pgm_header->pgm_options = PGM_OPT_PRESENT; + STATE(skb)->pgm_header->pgm_tsdu_length = htons (STATE(tsdu_length)); + +/* ODATA */ + STATE(skb)->pgm_data->data_sqn = htonl (pgm_txw_next_lead(sock->window)); + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + +/* OPT_LENGTH */ + struct pgm_opt_length* opt_len = (struct pgm_opt_length*)(STATE(skb)->pgm_data + 1); + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); + opt_len->opt_total_length = htons ( sizeof(struct pgm_opt_length) + + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment) ); +/* OPT_FRAGMENT */ + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_FRAGMENT | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment); + STATE(skb)->pgm_opt_fragment = (struct pgm_opt_fragment*)(opt_header + 1); + STATE(skb)->pgm_opt_fragment->opt_reserved = 0; + STATE(skb)->pgm_opt_fragment->opt_sqn = htonl (STATE(first_sqn)); + STATE(skb)->pgm_opt_fragment->opt_frag_off = htonl (STATE(data_bytes_offset)); + STATE(skb)->pgm_opt_fragment->opt_frag_len = htonl (STATE(apdu_length)); + +/* checksum & copy */ + STATE(skb)->pgm_header->pgm_checksum = 0; + const size_t pgm_header_len = (char*)(STATE(skb)->pgm_opt_fragment + 1) - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + +/* iterate over one or more vector elements to perform scatter/gather checksum & copy + * + * STATE(vector_index) - index into application scatter/gather vector + * STATE(vector_offset) - current offset into current vector element + * STATE(unfolded_odata)- checksum accumulator + */ + const char* src = (const char*)vector[STATE(vector_index)].iov_base + STATE(vector_offset); + char* dst = (char*)(STATE(skb)->pgm_opt_fragment + 1); + size_t src_length = vector[STATE(vector_index)].iov_len - STATE(vector_offset); + size_t dst_length = 0; + size_t copy_length = MIN( STATE(tsdu_length), src_length ); + STATE(unfolded_odata) = pgm_csum_partial_copy (src, dst, copy_length, 0); + + for(;;) + { + if (copy_length == src_length) { +/* application packet complete */ + STATE(vector_index)++; + STATE(vector_offset) = 0; + } else { +/* data still remaining */ + STATE(vector_offset) += copy_length; + } + + dst_length += copy_length; + +/* sock packet complete */ + if (dst_length == STATE(tsdu_length)) + break; + + src = (const char*)vector[STATE(vector_index)].iov_base + STATE(vector_offset); + dst += copy_length; + src_length = vector[STATE(vector_index)].iov_len - STATE(vector_offset); + copy_length = MIN( STATE(tsdu_length) - dst_length, src_length ); + const uint32_t unfolded_element = pgm_csum_partial_copy (src, dst, copy_length, 0); + STATE(unfolded_odata) = pgm_csum_block_add (STATE(unfolded_odata), unfolded_element, dst_length); + } + + STATE(skb)->pgm_header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, STATE(unfolded_odata), pgm_header_len)); + +/* add to transmit window, skb::data set to payload */ + pgm_spinlock_lock (&sock->txw_spinlock); + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + + ssize_t sent; + size_t tpdu_length; +retry_one_apdu_send: + tpdu_length = (char*)STATE(skb)->tail - (char*)STATE(skb)->head; + sent = pgm_sendto (sock, + !STATE(is_rate_limited), /* rate limited on blocking */ + FALSE, /* regular socket */ + STATE(skb)->head, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + if (sent < 0 && (EAGAIN == errno || ENOBUFS == errno)) { + sock->is_apdu_eagain = TRUE; + sock->blocklen = tpdu_length; + goto blocked; + } + +/* save unfolded odata for retransmissions */ + pgm_txw_set_unfolded_checksum (STATE(skb), STATE(unfolded_odata)); + + if (PGM_LIKELY((size_t)sent == tpdu_length)) { + bytes_sent += tpdu_length + sock->iphdr_len; /* as counted at IP layer */ + packets_sent++; /* IP packets */ + data_bytes_sent += STATE(tsdu_length); + } + + STATE(data_bytes_offset) += STATE(tsdu_length); + +/* check for end of transmission group */ + if (sock->use_proactive_parity) { + const uint32_t odata_sqn = ntohl (STATE(skb)->pgm_data->data_sqn); + const uint32_t tg_sqn_mask = 0xffffffff << sock->tg_sqn_shift; + if (!((odata_sqn + 1) & ~tg_sqn_mask)) + pgm_schedule_proactive_nak (sock, odata_sqn & tg_sqn_mask); + } + + } while ( STATE(data_bytes_offset) < STATE(apdu_length) ); + pgm_assert( STATE(data_bytes_offset) == STATE(apdu_length) ); + + sock->is_apdu_eagain = FALSE; + reset_heartbeat_spm (sock, STATE(skb)->tstamp); + + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], bytes_sent); + sock->cumulative_stats[PGM_PC_SOURCE_DATA_MSGS_SENT] += packets_sent; + sock->cumulative_stats[PGM_PC_SOURCE_DATA_BYTES_SENT] += data_bytes_sent; + if (bytes_written) + *bytes_written = STATE(apdu_length); + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_NORMAL; + +blocked: + if (bytes_sent) { + reset_heartbeat_spm (sock, STATE(skb)->tstamp); + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], bytes_sent); + sock->cumulative_stats[PGM_PC_SOURCE_DATA_MSGS_SENT] += packets_sent; + sock->cumulative_stats[PGM_PC_SOURCE_DATA_BYTES_SENT] += data_bytes_sent; + } + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + if (EAGAIN == errno) { + if (sock->use_pgmcc) + pgm_notify_clear (&sock->ack_notify); + return PGM_IO_STATUS_WOULD_BLOCK; + } + return PGM_IO_STATUS_RATE_LIMITED; +} + +/* send PGM original data, transmit window owned scatter/gather IO vector. + * + * ⎢ TSDU₀ ⎢ + * ⎢ TSDU₁ ⎢ → pgm_send_skbv() → ⎢ ⋯ TSDU₁ TSDU₀ ⎢ → libc + * ⎢ ⋮ ⎢ + * + * on success, returns PGM_IO_STATUS_NORMAL, on block for non-blocking sockets + * returns PGM_IO_STATUS_WOULD_BLOCK, returns PGM_IO_STATUS_RATE_LIMITED if + * packet size exceeds the current rate limit. + */ + +int +pgm_send_skbv ( + pgm_sock_t* const restrict sock, + struct pgm_sk_buff_t** const restrict vector, /* array of skb pointers vs. array of skbs */ + const unsigned count, + const bool is_one_apdu, /* true: vector = apdu, false: vector::iov_base = apdu */ + size_t* restrict bytes_written + ) +{ + pgm_debug ("pgm_send_skbv (sock:%p vector:%p count:%u is-one-apdu:%s bytes-written:%p)", + (const void*)sock, + (const void*)vector, + count, + is_one_apdu ? "TRUE" : "FALSE", + (const void*)bytes_written); + + pgm_return_val_if_fail (NULL != sock, PGM_IO_STATUS_ERROR); + pgm_return_val_if_fail (count <= PGM_MAX_FRAGMENTS, PGM_IO_STATUS_ERROR); + if (PGM_LIKELY(count)) pgm_return_val_if_fail (NULL != vector, PGM_IO_STATUS_ERROR); + if (PGM_UNLIKELY(!pgm_rwlock_reader_trylock (&sock->lock))) + pgm_return_val_if_reached (PGM_IO_STATUS_ERROR); + if (PGM_UNLIKELY(!sock->is_bound || + sock->is_destroyed)) + { + pgm_rwlock_reader_unlock (&sock->lock); + pgm_return_val_if_reached (PGM_IO_STATUS_ERROR); + } + + pgm_mutex_lock (&sock->source_mutex); + +/* pass on zero length as cannot count vector lengths */ + if (PGM_UNLIKELY(0 == count)) + { + const int status = send_odata_copy (sock, NULL, count, bytes_written); + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; + } + else if (1 == count) + { + const int status = send_odata (sock, vector[0], bytes_written); + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return status; + } + + size_t bytes_sent = 0; + unsigned packets_sent = 0; + size_t data_bytes_sent = 0; + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + +/* continue if blocked mid-apdu */ + if (sock->is_apdu_eagain) + goto retry_send; + + STATE(is_rate_limited) = FALSE; + if (sock->is_nonblocking && sock->is_controlled_odata) + { + size_t total_tpdu_length = 0; + for (unsigned i = 0; i < count; i++) + total_tpdu_length += sock->iphdr_len + pgm_pkt_offset (is_one_apdu, pgmcc_family) + vector[i]->len; + +/* calculation includes one iphdr length already */ + if (!pgm_rate_check (&sock->rate_control, + total_tpdu_length - sock->iphdr_len, + sock->is_nonblocking)) + { + sock->blocklen = total_tpdu_length; + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_RATE_LIMITED; + } + STATE(is_rate_limited) = TRUE; + } + + if (is_one_apdu) + { + STATE(apdu_length) = 0; + STATE(first_sqn) = pgm_txw_next_lead(sock->window); + for (unsigned i = 0; i < count; i++) + { + if (PGM_UNLIKELY(vector[i]->len > sock->max_tsdu_fragment)) { + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_ERROR; + } + STATE(apdu_length) += vector[i]->len; + } + if (PGM_UNLIKELY(STATE(apdu_length) > sock->max_apdu)) { + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_ERROR; + } + } + + for (STATE(vector_index) = 0; STATE(vector_index) < count; STATE(vector_index)++) + { + STATE(tsdu_length) = vector[STATE(vector_index)]->len; + + STATE(skb) = pgm_skb_get(vector[STATE(vector_index)]); + STATE(skb)->sock = sock; + STATE(skb)->tstamp = pgm_time_update_now(); + + STATE(skb)->pgm_header = (struct pgm_header*)STATE(skb)->head; + STATE(skb)->pgm_data = (struct pgm_data*)(STATE(skb)->pgm_header + 1); + memcpy (STATE(skb)->pgm_header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + STATE(skb)->pgm_header->pgm_sport = sock->tsi.sport; + STATE(skb)->pgm_header->pgm_dport = sock->dport; + STATE(skb)->pgm_header->pgm_type = PGM_ODATA; + STATE(skb)->pgm_header->pgm_options = is_one_apdu ? PGM_OPT_PRESENT : 0; + STATE(skb)->pgm_header->pgm_tsdu_length = htons (STATE(tsdu_length)); + +/* ODATA */ + STATE(skb)->pgm_data->data_sqn = htonl (pgm_txw_next_lead(sock->window)); + STATE(skb)->pgm_data->data_trail = htonl (pgm_txw_trail(sock->window)); + + if (is_one_apdu) + { +/* OPT_LENGTH */ + struct pgm_opt_length* opt_len = (struct pgm_opt_length*)(STATE(skb)->pgm_data + 1); + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); + opt_len->opt_total_length = htons ( sizeof(struct pgm_opt_length) + + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment) ); +/* OPT_FRAGMENT */ + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_FRAGMENT | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment); + STATE(skb)->pgm_opt_fragment = (struct pgm_opt_fragment*)(opt_header + 1); + STATE(skb)->pgm_opt_fragment->opt_reserved = 0; + STATE(skb)->pgm_opt_fragment->opt_sqn = htonl (STATE(first_sqn)); + STATE(skb)->pgm_opt_fragment->opt_frag_off = htonl (STATE(data_bytes_offset)); + STATE(skb)->pgm_opt_fragment->opt_frag_len = htonl (STATE(apdu_length)); + + pgm_assert (STATE(skb)->data == (STATE(skb)->pgm_opt_fragment + 1)); + } + else + { + pgm_assert (STATE(skb)->data == (STATE(skb)->pgm_data + 1)); + } + +/* TODO: the assembly checksum & copy routine is faster than memcpy & pgm_cksum on >= opteron hardware */ + STATE(skb)->pgm_header->pgm_checksum = 0; + pgm_assert ((char*)STATE(skb)->data > (char*)STATE(skb)->pgm_header); + const size_t pgm_header_len = (char*)STATE(skb)->data - (char*)STATE(skb)->pgm_header; + const uint32_t unfolded_header = pgm_csum_partial (STATE(skb)->pgm_header, pgm_header_len, 0); + STATE(unfolded_odata) = pgm_csum_partial ((char*)STATE(skb)->data, STATE(tsdu_length), 0); + STATE(skb)->pgm_header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, STATE(unfolded_odata), pgm_header_len)); + +/* add to transmit window, skb::data set to payload */ + pgm_spinlock_lock (&sock->txw_spinlock); + pgm_txw_add (sock->window, STATE(skb)); + pgm_spinlock_unlock (&sock->txw_spinlock); + ssize_t sent; + size_t tpdu_length; +retry_send: + pgm_assert ((char*)STATE(skb)->tail > (char*)STATE(skb)->head); + tpdu_length = (char*)STATE(skb)->tail - (char*)STATE(skb)->head; + sent = pgm_sendto (sock, + !STATE(is_rate_limited), /* rate limited on blocking */ + FALSE, /* regular socket */ + STATE(skb)->head, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + if (sent < 0 && (EAGAIN == errno || ENOBUFS == errno)) { + sock->is_apdu_eagain = TRUE; + sock->blocklen = tpdu_length; + goto blocked; + } + +/* save unfolded odata for retransmissions */ + pgm_txw_set_unfolded_checksum (STATE(skb), STATE(unfolded_odata)); + + if (PGM_LIKELY((size_t)sent == tpdu_length)) { + bytes_sent += tpdu_length + sock->iphdr_len; /* as counted at IP layer */ + packets_sent++; /* IP packets */ + data_bytes_sent += STATE(tsdu_length); + } + + pgm_free_skb (STATE(skb)); + STATE(data_bytes_offset) += STATE(tsdu_length); + +/* check for end of transmission group */ + if (sock->use_proactive_parity) { + const uint32_t odata_sqn = ntohl (STATE(skb)->pgm_data->data_sqn); + const uint32_t tg_sqn_mask = 0xffffffff << sock->tg_sqn_shift; + if (!((odata_sqn + 1) & ~tg_sqn_mask)) + pgm_schedule_proactive_nak (sock, odata_sqn & tg_sqn_mask); + } + + } +#ifdef TRANSPORT_DEBUG + if (is_one_apdu) + { + pgm_assert( STATE(data_bytes_offset) == STATE(apdu_length) ); + } +#endif + + sock->is_apdu_eagain = FALSE; + reset_heartbeat_spm (sock, STATE(skb)->tstamp); + + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], bytes_sent); + sock->cumulative_stats[PGM_PC_SOURCE_DATA_MSGS_SENT] += packets_sent; + sock->cumulative_stats[PGM_PC_SOURCE_DATA_BYTES_SENT] += data_bytes_sent; + if (bytes_written) + *bytes_written = data_bytes_sent; + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + return PGM_IO_STATUS_NORMAL; + +blocked: + if (bytes_sent) { + reset_heartbeat_spm (sock, STATE(skb)->tstamp); + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], bytes_sent); + sock->cumulative_stats[PGM_PC_SOURCE_DATA_MSGS_SENT] += packets_sent; + sock->cumulative_stats[PGM_PC_SOURCE_DATA_BYTES_SENT] += data_bytes_sent; + } + pgm_mutex_unlock (&sock->source_mutex); + pgm_rwlock_reader_unlock (&sock->lock); + if (EAGAIN == errno) { + if (sock->use_pgmcc) + pgm_notify_clear (&sock->ack_notify); + return PGM_IO_STATUS_WOULD_BLOCK; + } + return PGM_IO_STATUS_RATE_LIMITED; +} + +/* cleanup resuming send state helper + */ +#undef STATE + +/* send repair packet. + * + * on success, TRUE is returned. on error, FALSE is returned. + */ + +static +bool +send_rdata ( + pgm_sock_t* restrict sock, + struct pgm_sk_buff_t* restrict skb + ) +{ +/* pre-conditions */ + pgm_assert (NULL != sock); + pgm_assert (NULL != skb); + pgm_assert ((char*)skb->tail > (char*)skb->head); + + const size_t tpdu_length = (char*)skb->tail - (char*)skb->head; + +/* update previous odata/rdata contents */ + struct pgm_header* header = skb->pgm_header; + struct pgm_data* rdata = skb->pgm_data; + header->pgm_type = PGM_RDATA; +/* RDATA */ + rdata->data_trail = htonl (pgm_txw_trail(sock->window)); + + header->pgm_checksum = 0; + const size_t pgm_header_len = tpdu_length - ntohs(header->pgm_tsdu_length); + uint32_t unfolded_header = pgm_csum_partial (header, pgm_header_len, 0); + uint32_t unfolded_odata = pgm_csum_partial (skb->data, ntohs(header->pgm_tsdu_length), 0); + header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, unfolded_odata, pgm_header_len)); + +/* congestion control */ + if (sock->use_pgmcc && + sock->tokens < pgm_fp8 (1)) + { +// pgm_trace (PGM_LOG_ROLE_CONGESTION_CONTROL,_("Token limit reached.")); + sock->blocklen = tpdu_length; + return FALSE; + } + + const ssize_t sent = pgm_sendto (sock, + sock->is_controlled_rdata, /* rate limited */ + TRUE, /* with router alert */ + header, + tpdu_length, + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + + if (sent < 0 && EAGAIN == errno) { + sock->blocklen = tpdu_length; + return FALSE; + } + + const pgm_time_t now = pgm_time_update_now(); + + if (sock->use_pgmcc) { + sock->tokens -= pgm_fp8 (1); + sock->ack_expiry = now + sock->ack_expiry_ivl; + } + +/* re-set spm timer: we are already in the timer thread, no need to prod timers + */ + pgm_mutex_lock (&sock->timer_mutex); + sock->spm_heartbeat_state = 1; + sock->next_heartbeat_spm = now + sock->spm_heartbeat_interval[sock->spm_heartbeat_state++]; + pgm_mutex_unlock (&sock->timer_mutex); + + pgm_txw_inc_retransmit_count (skb); + sock->cumulative_stats[PGM_PC_SOURCE_SELECTIVE_BYTES_RETRANSMITTED] += ntohs(header->pgm_tsdu_length); + sock->cumulative_stats[PGM_PC_SOURCE_SELECTIVE_MSGS_RETRANSMITTED]++; /* impossible to determine APDU count */ + pgm_atomic_add32 (&sock->cumulative_stats[PGM_PC_SOURCE_BYTES_SENT], tpdu_length + sock->iphdr_len); + return TRUE; +} + +/* eof */ diff --git a/3rdparty/openpgm-svn-r1135/pgm/source.c.rej b/3rdparty/openpgm-svn-r1135/pgm/source.c.rej new file mode 100644 index 0000000..515f7ec --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/source.c.rej @@ -0,0 +1,17 @@ +*************** +*** 2295,2301 **** + header->pgm_checksum = 0; + const size_t pgm_header_len = tpdu_length - ntohs(header->pgm_tsdu_length); + uint32_t unfolded_header = pgm_csum_partial (header, pgm_header_len, 0); +- uint32_t unfolded_odata = pgm_txw_get_unfolded_checksum (skb); + header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, unfolded_odata, pgm_header_len)); + + /* congestion control */ +--- 2295,2301 ---- + header->pgm_checksum = 0; + const size_t pgm_header_len = tpdu_length - ntohs(header->pgm_tsdu_length); + uint32_t unfolded_header = pgm_csum_partial (header, pgm_header_len, 0); ++ uint32_t unfolded_odata = pgm_csum_partial (skb->data, ntohs(header->pgm_tsdu_length), 0); + header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, unfolded_odata, pgm_header_len)); + + /* congestion control */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/source_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/source_unittest.c index 27ffebe..d34f165 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/source_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/source_unittest.c @@ -73,8 +73,9 @@ static gboolean mock_is_valid_nnak = TRUE; #define pgm_compat_csum_partial_copy mock_pgm_compat_csum_partial_copy #define pgm_csum_block_add mock_pgm_csum_block_add #define pgm_csum_fold mock_pgm_csum_fold -#define pgm_sendto mock_pgm_sendto +#define pgm_sendto_hops mock_pgm_sendto_hops #define pgm_time_update_now mock_pgm_time_update_now +#define pgm_setsockopt mock_pgm_setsockopt #define SOURCE_DEBUG @@ -456,10 +457,11 @@ mock_pgm_csum_fold ( PGM_GNUC_INTERNAL ssize_t -mock_pgm_sendto ( - pgm_sock_t* sock, +mock_pgm_sendto_hops ( + pgm_sock_t* sock, bool use_rate_limit, bool use_router_alert, + int level, const void* buf, size_t len, const struct sockaddr* to, @@ -468,10 +470,11 @@ mock_pgm_sendto ( { char saddr[INET6_ADDRSTRLEN]; pgm_sockaddr_ntop (to, saddr, sizeof(saddr)); - g_debug ("mock_pgm_sendto (sock:%p use-rate-limit:%s use-router-alert:%s buf:%p len:%d to:%s tolen:%d)", + g_debug ("mock_pgm_sendto (sock:%p use-rate-limit:%s use-router-alert:%s level:%d buf:%p len:%d to:%s tolen:%d)", (gpointer)sock, use_rate_limit ? "YES" : "NO", use_router_alert ? "YES" : "NO", + level, buf, len, saddr, @@ -505,6 +508,20 @@ pgm_pkt_offset ( : ( sizeof(struct pgm_header) + sizeof(struct pgm_data) ); } +bool +mock_pgm_setsockopt ( + pgm_sock_t* const sock, + const int level, + const int optname, + const void* optval, + const socklen_t optlen + ) +{ + if (NULL == sock) + return FALSE; + return TRUE; +} + /* mock functions for external references */ @@ -936,6 +953,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_AMBIENT_SPM, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -946,21 +964,23 @@ START_TEST (test_set_ambient_spm_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_AMBIENT_SPM; const int ambient_spm = pgm_msecs(1000); const void* optval = &ambient_spm; const socklen_t optlen = sizeof(ambient_spm); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_ambient_spm failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_ambient_spm failed"); } END_TEST START_TEST (test_set_ambient_spm_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_AMBIENT_SPM; const int ambient_spm = pgm_msecs(1000); const void* optval = &ambient_spm; const socklen_t optlen = sizeof(ambient_spm); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_ambient_spm failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_ambient_spm failed"); } END_TEST @@ -968,6 +988,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_HEARTBEAT_SPM, * const void* optval, * const socklen_t optlen = sizeof(int) * n @@ -978,21 +999,23 @@ START_TEST (test_set_heartbeat_spm_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_HEARTBEAT_SPM; const int intervals[] = { 1, 2, 3, 4, 5 }; const void* optval = &intervals; const socklen_t optlen = sizeof(intervals); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_heartbeat_spm failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_heartbeat_spm failed"); } END_TEST START_TEST (test_set_heartbeat_spm_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_HEARTBEAT_SPM; const int intervals[] = { 1, 2, 3, 4, 5 }; const void* optval = &intervals; const socklen_t optlen = sizeof(intervals); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_heartbeat_spm failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_heartbeat_spm failed"); } END_TEST @@ -1000,6 +1023,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_TXW_SQNS, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -1010,21 +1034,23 @@ START_TEST (test_set_txw_sqns_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_TXW_SQNS; const int txw_sqns = 100; const void* optval = &txw_sqns; const socklen_t optlen = sizeof(txw_sqns); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_txw_sqns failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_txw_sqns failed"); } END_TEST START_TEST (test_set_txw_sqns_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_TXW_SQNS; const int txw_sqns = 100; const void* optval = &txw_sqns; const socklen_t optlen = sizeof(txw_sqns); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_txw_sqns failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_txw_sqns failed"); } END_TEST @@ -1032,6 +1058,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_TXW_SECS, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -1042,21 +1069,23 @@ START_TEST (test_set_txw_secs_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_TXW_SECS; const int txw_secs = pgm_secs(10); const void* optval = &txw_secs; const socklen_t optlen = sizeof(txw_secs); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_txw_secs failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_txw_secs failed"); } END_TEST START_TEST (test_set_txw_secs_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_TXW_SECS; const int txw_secs = pgm_secs(10); const void* optval = &txw_secs; const socklen_t optlen = sizeof(txw_secs); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_txw_secs failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_txw_secs failed"); } END_TEST @@ -1064,6 +1093,7 @@ END_TEST * bool * pgm_setsockopt ( * pgm_sock_t* const sock, + * const int level = IPPROTO_PGM, * const int optname = PGM_TXW_MAX_RTE, * const void* optval, * const socklen_t optlen = sizeof(int) @@ -1074,21 +1104,23 @@ START_TEST (test_set_txw_max_rte_pass_001) { pgm_sock_t* sock = generate_sock (); fail_if (NULL == sock, "generate_sock failed"); + const int level = IPPROTO_PGM; const int optname = PGM_TXW_MAX_RTE; const int txw_max_rte = 100*1000; const void* optval = &txw_max_rte; const socklen_t optlen = sizeof(txw_max_rte); - fail_unless (TRUE == pgm_setsockopt (sock, optname, optval, optlen), "set_txw_max_rte failed"); + fail_unless (TRUE == pgm_setsockopt (sock, level, optname, optval, optlen), "set_txw_max_rte failed"); } END_TEST START_TEST (test_set_txw_max_rte_fail_001) { + const int level = IPPROTO_PGM; const int optname = PGM_TXW_MAX_RTE; const int txw_max_rte = 100*1000; const void* optval = &txw_max_rte; const socklen_t optlen = sizeof(txw_max_rte); - fail_unless (FALSE == pgm_setsockopt (NULL, optname, optval, optlen), "set_txw_max_rte failed"); + fail_unless (FALSE == pgm_setsockopt (NULL, level, optname, optval, optlen), "set_txw_max_rte failed"); } END_TEST diff --git a/3rdparty/openpgm-svn-r1085/pgm/string.c b/3rdparty/openpgm-svn-r1135/pgm/string.c index 93458fd..f8f8e33 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/string.c +++ b/3rdparty/openpgm-svn-r1135/pgm/string.c @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifdef CONFIG_HAVE_VASPRINTF +#if defined(CONFIG_HAVE_VASPRINTF) && !defined(_GNU_SOURCE) # define _GNU_SOURCE #endif #include <limits.h> diff --git a/3rdparty/openpgm-svn-r1135/pgm/string.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/string.c.c89.patch new file mode 100644 index 0000000..8dd3d78 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/string.c.c89.patch @@ -0,0 +1,39 @@ +65a66,68 +> #ifdef _MSC_VER +> return _vscprintf (format, args) + 1; +> #else +67a71 +> #endif +80a85 +> { +81a87 +> { +85a92,94 +> # ifdef _MSC_VER +> va_list args2 = args; +> # else +87a97 +> # endif +89a100 +> { +93a105,106 +> } +> } +118a132 +> { +124a139 +> } +198a214,216 +> #ifdef _MSC_VER +> strncpy_s (new_string, len + 1, remainder, len); +> #else +199a218 +> #endif +233c252,254 +< for (unsigned i = 0; str_array[i] != NULL; i++) +--- +> { +> unsigned i; +> for (i = 0; str_array[i] != NULL; i++) +234a256 +> } diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/PGM/Test.pm b/3rdparty/openpgm-svn-r1135/pgm/test/PGM/Test.pm index cb2ee6d..cb2ee6d 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/PGM/Test.pm +++ b/3rdparty/openpgm-svn-r1135/pgm/test/PGM/Test.pm diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/SConscript b/3rdparty/openpgm-svn-r1135/pgm/test/SConscript index 7ca9926..7ca9926 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/SConscript +++ b/3rdparty/openpgm-svn-r1135/pgm/test/SConscript diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/ambient_spm.pl b/3rdparty/openpgm-svn-r1135/pgm/test/ambient_spm.pl index dca52a5..90de632 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/ambient_spm.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/ambient_spm.pl @@ -32,6 +32,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); if (my $pid = fork) { diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/apdu.pl b/3rdparty/openpgm-svn-r1135/pgm/test/apdu.pl index f4669c0..b26a3f2 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/apdu.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/apdu.pl @@ -30,11 +30,13 @@ print "mon: ready.\n"; $app->say ("set network $config{app}{network}"); $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); $sim->say ("set network $config{sim}{network}"); $sim->say ("create ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish APDU.\n"; $sim->say ("send ao ringo x 1000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/apdu_parity.pl b/3rdparty/openpgm-svn-r1135/pgm/test/apdu_parity.pl index eb4cf27..eb4cf27 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/apdu_parity.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/apdu_parity.pl diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/app.c b/3rdparty/openpgm-svn-r1135/pgm/test/app.c index 1d8f585..ea6a2b7 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/app.c +++ b/3rdparty/openpgm-svn-r1135/pgm/test/app.c @@ -2,7 +2,7 @@ * * PGM conformance test application. * - * Copyright (c) 2006-2007 Miru Limited. + * Copyright (c) 2006-2010 Miru Limited. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,7 +19,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - #include <errno.h> #include <getopt.h> #include <netdb.h> @@ -51,14 +50,14 @@ /* typedefs */ struct idle_source { - GSource source; - guint64 expiration; + GSource source; + guint64 expiration; }; struct app_session { - char* name; - pgm_transport_t* transport; - pgm_async_t* async; + char* name; + pgm_sock_t* sock; + pgm_async_t* async; }; /* globals */ @@ -182,9 +181,9 @@ destroy_session ( { struct app_session* sess = (struct app_session*)value; - g_message ("destroying transport \"%s\"", (char*)key); - pgm_transport_destroy (sess->transport, TRUE); - sess->transport = NULL; + g_message ("closing socket \"%s\"", (char*)key); + pgm_close (sess->sock, TRUE); + sess->sock = NULL; if (sess->async) { g_message ("destroying asynchronous session on \"%s\"", (char*)key); @@ -250,50 +249,28 @@ on_data ( static void session_create ( - char* name + char* session_name ) { - struct pgm_transport_info_t hints = { - .ti_family = AF_INET - }, *res = NULL; - pgm_error_t* err = NULL; + pgm_error_t* pgm_err = NULL; /* check for duplicate */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess != NULL) { - puts ("FAILED: duplicate session"); + printf ("FAILED: duplicate session name '%s'\n", session_name); return; } /* create new and fill in bits */ sess = g_new0(struct app_session, 1); - sess->name = g_memdup (name, strlen(name)+1); - - if (!pgm_if_get_transport_info (g_network, &hints, &res, &err)) { - printf ("FAILED: pgm_if_get_transport_info(): %s\n", (err && err->message) ? err->message : "(null)"); - pgm_error_free (err); - goto err_free; - } - - if (!pgm_gsi_create_from_hostname (&res->ti_gsi, &err)) { - printf ("FAILED: pgm_gsi_create_from_hostname(): %s\n", (err && err->message) ? err->message : "(null)"); - pgm_error_free (err); - pgm_if_free_transport_info (res); - goto err_free; - } + sess->name = g_memdup (session_name, strlen(session_name)+1); - res->ti_dport = g_port; - res->ti_sport = 0; -printf ("pgm_transport_create (transport:%p res:%p err:%p)\n", (gpointer)sess->transport, (gpointer)res, (gpointer)&err); - if (!pgm_transport_create (&sess->transport, res, &err)) { - printf ("FAILED: pgm_transport_create(): %s\n", (err && err->message) ? err->message : "(null)"); - pgm_error_free (err); - pgm_if_free_transport_info (res); + if (!pgm_socket (&sess->sock, AF_INET, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err)) { + printf ("FAILED: pgm_socket(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + pgm_error_free (pgm_err); goto err_free; } - pgm_if_free_transport_info (res); - /* success */ g_hash_table_insert (g_sessions, sess->name, sess); printf ("created new session \"%s\"\n", sess->name); @@ -309,19 +286,25 @@ err_free: static void session_set_nak_bo_ivl ( - char* name, - guint nak_bo_ivl /* milliseconds */ + char* session_name, + guint milliseconds ) { /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); + return; + } + + if (pgm_msecs (milliseconds) > INT_MAX) { + puts ("FAILED: value out of bounds"); return; } - if (!pgm_transport_set_nak_bo_ivl (sess->transport, pgm_msecs(nak_bo_ivl))) - puts ("FAILED: pgm_transport_set_nak_bo_ivl"); + const int nak_bo_ivl = pgm_msecs (milliseconds); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl))) + printf ("FAILED: set NAK_BO_IVL = %dms\n", milliseconds); else puts ("READY"); } @@ -329,19 +312,25 @@ session_set_nak_bo_ivl ( static void session_set_nak_rpt_ivl ( - char* name, - guint nak_rpt_ivl /* milliseconds */ + char* session_name, + guint milliseconds ) { /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - if (!pgm_transport_set_nak_rpt_ivl (sess->transport, pgm_msecs(nak_rpt_ivl))) - puts ("FAILED: pgm_transport_set_nak_rpt_ivl"); + if (pgm_msecs (milliseconds) > INT_MAX) { + puts ("FAILED: value out of bounds"); + return; + } + + const int nak_rpt_ivl = pgm_msecs (milliseconds); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl))) + printf ("FAILED: set NAK_RPT_IVL = %dms\n", milliseconds); else puts ("READY"); } @@ -349,19 +338,25 @@ session_set_nak_rpt_ivl ( static void session_set_nak_rdata_ivl ( - char* name, - guint nak_rdata_ivl /* milliseconds */ + char* session_name, + guint milliseconds ) { /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); + return; + } + + if (pgm_msecs (milliseconds) > INT_MAX) { + puts ("FAILED: value out of bounds"); return; } - if (!pgm_transport_set_nak_rdata_ivl (sess->transport, pgm_msecs(nak_rdata_ivl))) - puts ("FAILED: pgm_transport_set_nak_rdata_ivl"); + const int nak_rdata_ivl = pgm_msecs (milliseconds); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl))) + printf ("FAILED: set NAK_RDATA_IVL = %dms\n", milliseconds); else puts ("READY"); } @@ -369,19 +364,25 @@ session_set_nak_rdata_ivl ( static void session_set_nak_ncf_retries ( - char* name, - guint nak_ncf_retries + char* session_name, + guint retry_count ) { /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - if (!pgm_transport_set_nak_ncf_retries (sess->transport, nak_ncf_retries)) - puts ("FAILED pgm_transport_set_nak_ncf_retries"); + if (retry_count > INT_MAX) { + puts ("FAILED: value out of bounds"); + return; + } + + const int nak_ncf_retries = retry_count; + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries))) + printf ("FAILED: set NAK_NCF_RETRIES = %d\n", retry_count); else puts ("READY"); } @@ -389,19 +390,25 @@ session_set_nak_ncf_retries ( static void session_set_nak_data_retries ( - char* name, - guint nak_data_retries + char* session_name, + guint retry_count ) { /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); + return; + } + + if (retry_count > INT_MAX) { + puts ("FAILED: value out of bounds"); return; } - if (!pgm_transport_set_nak_data_retries (sess->transport, nak_data_retries)) - puts ("FAILED: pgm_transport_set_nak_data_retries"); + const int nak_data_retries = retry_count; + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries))) + printf ("FAILED: set NAK_DATA_RETRIES = %d\n", retry_count); else puts ("READY"); } @@ -409,19 +416,25 @@ session_set_nak_data_retries ( static void session_set_txw_max_rte ( - char* name, - guint txw_max_rte + char* session_name, + guint bitrate ) { /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); + return; + } + + if (bitrate > INT_MAX) { + puts ("FAILED: value out of bounds"); return; } - if (!pgm_transport_set_txw_max_rte (sess->transport, txw_max_rte)) - puts ("FAILED:pgm_transport_set_txw_max_rte"); + const int txw_max_rte = bitrate; + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_TXW_MAX_RTE, &txw_max_rte, sizeof(txw_max_rte))) + printf ("FAILED: set TXW_MAX_RTE = %d\n", bitrate); else puts ("READY"); } @@ -429,97 +442,226 @@ session_set_txw_max_rte ( static void session_set_fec ( - char* name, - guint default_n, - guint default_k + char* session_name, + guint block_size, + guint group_size ) { /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - if (!pgm_transport_set_fec (sess->transport, - FALSE /* pro-active */, - TRUE /* on-demand */, - TRUE /* varpkt-len */, - default_n, - default_k)) + if (block_size > UINT8_MAX || + group_size > UINT8_MAX) { - puts ("FAILED: pgm_transport_set_fec"); + puts ("FAILED: value out of bounds"); + return; } + + const struct pgm_fecinfo_t fecinfo = { + .block_size = block_size, + .proactive_packets = 0, + .group_size = group_size, + .ondemand_parity_enabled = TRUE, + .var_pktlen_enabled = TRUE + }; + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_USE_FEC, &fecinfo, sizeof(fecinfo))) + printf ("FAILED: set FEC = RS(%d, %d)\n", block_size, group_size); else - { puts ("READY"); - } } static void session_bind ( - char* name + char* session_name ) { - const guint spm_heartbeat[] = { pgm_msecs(100), pgm_msecs(100), pgm_msecs(100), pgm_msecs(100), pgm_msecs(1300), pgm_secs(7), pgm_secs(16), pgm_secs(25), pgm_secs(30) }; - pgm_error_t* err = NULL; + pgm_error_t* pgm_err = NULL; /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - if (!pgm_transport_set_nonblocking (sess->transport, TRUE)) - puts ("FAILED: pgm_transport_set_nonblocking"); - if (!pgm_transport_set_max_tpdu (sess->transport, g_max_tpdu)) - puts ("FAILED: pgm_transport_set_max_tpdu"); - if (!pgm_transport_set_txw_sqns (sess->transport, g_sqns)) - puts ("FAILED: pgm_transport_set_txw_sqns"); - if (!pgm_transport_set_rxw_sqns (sess->transport, g_sqns)) - puts ("FAILED: pgm_transport_set_rxw_sqns"); - if (!pgm_transport_set_hops (sess->transport, 16)) - puts ("FAILED: pgm_transport_set_hops"); - if (!pgm_transport_set_ambient_spm (sess->transport, pgm_secs(30))) - puts ("FAILED: pgm_transport_set_ambient_spm"); - if (!pgm_transport_set_heartbeat_spm (sess->transport, spm_heartbeat, G_N_ELEMENTS(spm_heartbeat))) - puts ("FAILED: pgm_transport_set_heartbeat_spm"); - if (!pgm_transport_set_peer_expiry (sess->transport, pgm_secs(300))) - puts ("FAILED: pgm_transport_set_peer_expiry"); - if (!pgm_transport_set_spmr_expiry (sess->transport, pgm_msecs(250))) - puts ("FAILED: pgm_transport_set_spmr_expiry"); - if (!sess->transport->nak_bo_ivl && !pgm_transport_set_nak_bo_ivl (sess->transport, pgm_msecs(50))) - puts ("FAILED: pgm_transport_set_nak_bo_ivl"); - if (!sess->transport->nak_rpt_ivl && !pgm_transport_set_nak_rpt_ivl (sess->transport, pgm_secs(2))) - puts ("FAILED: pgm_transport_set_nak_rpt_ivl"); - if (!sess->transport->nak_rdata_ivl && !pgm_transport_set_nak_rdata_ivl (sess->transport, pgm_secs(2))) - puts ("FAILED: pgm_transport_set_nak_rdata_ivl"); - if (!sess->transport->nak_data_retries && !pgm_transport_set_nak_data_retries (sess->transport, 50)) - puts ("FAILED: pgm_transport_set_nak_data_retries"); - if (!sess->transport->nak_ncf_retries && !pgm_transport_set_nak_ncf_retries (sess->transport, 50)) - puts ("FAILED: pgm_transport_set_nak_ncf_retries"); - -printf ("pgm_transport_bind (transport:%p err:%p)\n", (gpointer)sess->transport, (gpointer)&err); - if (!pgm_transport_bind (sess->transport, &err)) { - printf ("FAILED: pgm_transport_bind(): %s\n", (err && err->message) ? err->message : "(null)"); - pgm_error_free (err); +/* Use RFC 2113 tagging for PGM Router Assist */ + const int no_router_assist = 0; + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist))) + puts ("FAILED: disable IP_ROUTER_ALERT"); + +/* set PGM parameters */ + const int send_and_receive = 0, + active = 0, + mtu = g_max_tpdu, + txw_sqns = g_sqns, + rxw_sqns = g_sqns, + ambient_spm = pgm_secs (30), + heartbeat_spm[] = { pgm_msecs (100), + pgm_msecs (100), + pgm_msecs (100), + pgm_msecs (100), + pgm_msecs (1300), + pgm_secs (7), + pgm_secs (16), + pgm_secs (25), + pgm_secs (30) }, + peer_expiry = pgm_secs (300), + spmr_expiry = pgm_msecs (250), + nak_bo_ivl = pgm_msecs (50), + nak_rpt_ivl = pgm_secs (2), + nak_rdata_ivl = pgm_secs (2), + nak_data_retries = 50, + nak_ncf_retries = 50; + + g_assert (G_N_ELEMENTS(heartbeat_spm) > 0); + + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_SEND_ONLY, &send_and_receive, sizeof(send_and_receive))) + puts ("FAILED: set bi-directional transport"); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_RECV_ONLY, &send_and_receive, sizeof(send_and_receive))) + puts ("FAILED: set bi-directional transport"); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_PASSIVE, &active, sizeof(active))) + puts ("FAILED: set active transport"); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_MTU, &mtu, sizeof(mtu))) + printf ("FAILED: set MAX_TPDU = %d bytes\n", mtu); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_TXW_SQNS, &txw_sqns, sizeof(txw_sqns))) + printf ("FAILED: set TXW_SQNS = %d\n", txw_sqns); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_RXW_SQNS, &rxw_sqns, sizeof(rxw_sqns))) + printf ("FAILED: set RXW_SQNS = %d\n", rxw_sqns); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm))) + printf ("FAILED: set AMBIENT_SPM = %ds\n", (int)pgm_to_secs (ambient_spm)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm))) + { + char buffer[1024]; + sprintf (buffer, "%d", heartbeat_spm[0]); + for (unsigned i = 1; i < G_N_ELEMENTS(heartbeat_spm); i++) { + char t[1024]; + sprintf (t, ", %d", heartbeat_spm[i]); + strcat (buffer, t); + } + printf ("FAILED: set HEARTBEAT_SPM = { %s }\n", buffer); + } + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry))) + printf ("FAILED: set PEER_EXPIRY = %ds\n",(int) pgm_to_secs (peer_expiry)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry))) + printf ("FAILED: set SPMR_EXPIRY = %dms\n", (int)pgm_to_msecs (spmr_expiry)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl))) + printf ("FAILED: set NAK_BO_IVL = %dms\n", (int)pgm_to_msecs (nak_bo_ivl)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl))) + printf ("FAILED: set NAK_RPT_IVL = %dms\n", (int)pgm_to_msecs (nak_rpt_ivl)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl))) + printf ("FAILED: set NAK_RDATA_IVL = %dms\n", (int)pgm_to_msecs (nak_rdata_ivl)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries))) + printf ("FAILED: set NAK_DATA_RETRIES = %d\n", nak_data_retries); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries))) + printf ("FAILED: set NAK_NCF_RETRIES = %d\n", nak_ncf_retries); + +/* create global session identifier */ + struct pgm_sockaddr_t addr; + memset (&addr, 0, sizeof(addr)); + addr.sa_port = g_port; + addr.sa_addr.sport = 0; + if (!pgm_gsi_create_from_hostname (&addr.sa_addr.gsi, &pgm_err)) { + printf ("FAILED: pgm_gsi_create_from_hostname(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + } + +{ + char buffer[1024]; + pgm_tsi_print_r (&addr.sa_addr, buffer, sizeof(buffer)); + printf ("pgm_bind (sock:%p addr:{port:%d tsi:%s} err:%p)\n", + (gpointer)sess->sock, + addr.sa_port, buffer, + (gpointer)&pgm_err); +} + if (!pgm_bind (sess->sock, &addr, sizeof(addr), &pgm_err)) { + printf ("FAILED: pgm_bind(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + pgm_error_free (pgm_err); } else puts ("READY"); } static void +session_connect ( + char* session_name + ) +{ + struct pgm_addrinfo_t hints = { + .ai_family = AF_INET + }, *res = NULL; + pgm_error_t* pgm_err = NULL; + +/* check that session exists */ + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); + if (sess == NULL) { + printf ("FAILED: session '%s' not found\n", session_name); + return; + } + + if (!pgm_getaddrinfo (g_network, &hints, &res, &pgm_err)) { + printf ("FAILED: pgm_getaddrinfo(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + pgm_error_free (pgm_err); + return; + } + +/* join IP multicast groups */ + for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req))) + { + char group[INET6_ADDRSTRLEN]; + getnameinfo ((struct sockaddr*)&res->ai_recv_addrs[i].gsr_group, sizeof(struct sockaddr_in), + group, sizeof(group), + NULL, 0, + NI_NUMERICHOST); + printf ("FAILED: join group (#%u %s)\n", (unsigned)res->ai_recv_addrs[i].gsr_interface, group); + } + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req))) + { + char group[INET6_ADDRSTRLEN]; + getnameinfo ((struct sockaddr*)&res->ai_send_addrs[0].gsr_group, sizeof(struct sockaddr_in), + group, sizeof(group), + NULL, 0, + NI_NUMERICHOST); + printf ("FAILED: send group (#%u %s)\n", (unsigned)res->ai_send_addrs[0].gsr_interface, group); + } + pgm_freeaddrinfo (res); + +/* set IP parameters */ + const int non_blocking = 1, + no_multicast_loop = 0, + multicast_hops = 16, + dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ + + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &no_multicast_loop, sizeof(no_multicast_loop))) + puts ("FAILED: disable multicast loop"); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops))) + printf ("FAILED: set TTL = %d\n", multicast_hops); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp))) + printf ("FAILED: set TOS = 0x%x\n", dscp); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NOBLOCK, &non_blocking, sizeof(non_blocking))) + puts ("FAILED: set non-blocking sockets"); + + if (!pgm_connect (sess->sock, &pgm_err)) { + printf ("FAILED: pgm_connect(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + } else + puts ("READY"); +} + +static +void session_send ( - char* name, + char* session_name, char* string ) { /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } @@ -531,23 +673,29 @@ session_send ( struct timeval tv; int timeout; again: -printf ("pgm_send (transport:%p string:\"%s\" stringlen:%" G_GSIZE_FORMAT " NULL)\n", (gpointer)sess->transport, string, stringlen); - status = pgm_send (sess->transport, string, stringlen, NULL); +printf ("pgm_send (sock:%p string:\"%s\" stringlen:%" G_GSIZE_FORMAT " NULL)\n", (gpointer)sess->sock, string, stringlen); + status = pgm_send (sess->sock, string, stringlen, NULL); switch (status) { case PGM_IO_STATUS_NORMAL: puts ("READY"); break; case PGM_IO_STATUS_TIMER_PENDING: - pgm_transport_get_timer_pending (sess->transport, &tv); + { + socklen_t optlen = sizeof (tv); + pgm_getsockopt (sess->sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); + } goto block; case PGM_IO_STATUS_RATE_LIMITED: - pgm_transport_get_rate_remaining (sess->transport, &tv); + { + socklen_t optlen = sizeof (tv); + pgm_getsockopt (sess->sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); + } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: block: timeout = PGM_IO_STATUS_WOULD_BLOCK == status ? -1 : ((tv.tv_sec * 1000) + (tv.tv_usec / 1000)); memset (fds, 0, sizeof(fds)); - pgm_transport_poll_info (sess->transport, fds, &n_fds, POLLOUT); + pgm_poll_info (sess->sock, fds, &n_fds, POLLOUT); poll (fds, n_fds, timeout /* ms */); goto again; default: @@ -559,21 +707,21 @@ block: static void session_listen ( - char* name + char* session_name ) { GError* err = NULL; /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } /* listen */ -printf ("pgm_async_create (async:%p transport:%p err:%p)\n", (gpointer)&sess->async, (gpointer)sess->transport, (gpointer)&err); - if (!pgm_async_create (&sess->async, sess->transport, &err)) { +printf ("pgm_async_create (async:%p sock:%p err:%p)\n", (gpointer)&sess->async, (gpointer)sess->sock, (gpointer)&err); + if (!pgm_async_create (&sess->async, sess->sock, &err)) { printf ("FAILED: pgm_async_create(): %s", err->message); g_error_free (err); return; @@ -585,18 +733,18 @@ printf ("pgm_async_create (async:%p transport:%p err:%p)\n", (gpointer)&sess->as static void session_destroy ( - char* name + char* session_name ) { /* check that session exists */ - struct app_session* sess = g_hash_table_lookup (g_sessions, name); + struct app_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } /* remove from hash table */ - g_hash_table_remove (g_sessions, name); + g_hash_table_remove (g_sessions, session_name); /* stop any async thread */ if (sess->async) { @@ -604,8 +752,8 @@ session_destroy ( sess->async = NULL; } - pgm_transport_destroy (sess->transport, TRUE); - sess->transport = NULL; + pgm_close (sess->sock, TRUE); + sess->sock = NULL; g_free (sess->name); sess->name = NULL; g_free (sess); @@ -643,7 +791,7 @@ on_stdin_data ( regex_t preg; regmatch_t pmatch[10]; -/* create transport */ +/* create socket */ const char *re = "^create[[:space:]]+([[:alnum:]]+)$"; regcomp (&preg, re, REG_EXTENDED); if (0 == regexec (&preg, str, G_N_ELEMENTS(pmatch), pmatch, 0)) @@ -796,7 +944,7 @@ on_stdin_data ( } regfree (&preg); -/* bind transport */ +/* bind socket */ re = "^bind[[:space:]]+([[:alnum:]]+)$"; regcomp (&preg, re, REG_EXTENDED); if (0 == regexec (&preg, str, G_N_ELEMENTS(pmatch), pmatch, 0)) @@ -812,6 +960,22 @@ on_stdin_data ( } regfree (&preg); +/* connect socket */ + re = "^connect[[:space:]]+([[:alnum:]]+)$"; + regcomp (&preg, re, REG_EXTENDED); + if (0 == regexec (&preg, str, G_N_ELEMENTS(pmatch), pmatch, 0)) + { + char *name = g_memdup (str + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so + 1 ); + name[ pmatch[1].rm_eo - pmatch[1].rm_so ] = 0; + + session_connect (name); + + g_free (name); + regfree (&preg); + goto out; + } + regfree (&preg); + /* send packet */ re = "^send[[:space:]]+([[:alnum:]]+)[[:space:]]+([[:alnum:]]+)$"; regcomp (&preg, re, REG_EXTENDED); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/async.c b/3rdparty/openpgm-svn-r1135/pgm/test/async.c index cc2c1ba..3be1458 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/async.c +++ b/3rdparty/openpgm-svn-r1135/pgm/test/async.c @@ -125,7 +125,7 @@ pgm_receiver_thread ( do { /* blocking read */ - const int status = pgm_recvmsg (async->transport, &msgv, 0, &bytes_read, NULL); + const int status = pgm_recvmsg (async->sock, &msgv, 0, &bytes_read, NULL); switch (status) { case PGM_IO_STATUS_NORMAL: { @@ -155,13 +155,15 @@ pgm_receiver_thread ( case PGM_IO_STATUS_TIMER_PENDING: { - pgm_transport_get_timer_pending (async->transport, &tv); - goto block; + socklen_t optlen = sizeof (tv); + pgm_getsockopt (async->sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); } + goto block; case PGM_IO_STATUS_RATE_LIMITED: { - pgm_transport_get_rate_remaining (async->transport, &tv); + socklen_t optlen = sizeof (tv); + pgm_getsockopt (async->sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: @@ -174,7 +176,7 @@ block: memset (fds, 0, sizeof(fds)); fds[0].fd = pgm_notify_get_fd (&async->destroy_notify); fds[0].events = POLLIN; - if (-1 == pgm_transport_poll_info (async->transport, &fds[1], &n_fds, POLLIN)) { + if (-1 == pgm_poll_info (async->sock, &fds[1], &n_fds, POLLIN)) { g_trace ("poll_info returned errno=%i",errno); goto cleanup; } @@ -184,7 +186,7 @@ block: int fd = pgm_notify_get_fd (&async->destroy_notify), n_fds = 1 + fd; FD_ZERO(&readfds); FD_SET(fd, &readfds); - if (-1 == pgm_transport_select_info (async->transport, &readfds, NULL, &n_fds)) { + if (-1 == pgm_select_info (async->sock, &readfds, NULL, &n_fds)) { g_trace ("select_info returned errno=%i",errno); goto cleanup; } @@ -208,9 +210,14 @@ block: goto cleanup; case PGM_IO_STATUS_RESET: - if (async->transport->is_abort_on_reset) + { + int is_abort_on_reset; + socklen_t optlen = sizeof (is_abort_on_reset); + pgm_getsockopt (async->sock, IPPROTO_PGM, PGM_ABORT_ON_RESET, &is_abort_on_reset, &optlen); + if (is_abort_on_reset) goto cleanup; break; + } /* TODO: report to user */ case PGM_IO_STATUS_FIN: @@ -235,23 +242,23 @@ cleanup: gboolean pgm_async_create ( pgm_async_t** async, - pgm_transport_t* const transport, + pgm_sock_t* const sock, GError** error ) { pgm_async_t* new_async; g_return_val_if_fail (NULL != async, FALSE); - g_return_val_if_fail (NULL != transport, FALSE); + g_return_val_if_fail (NULL != sock, FALSE); - g_trace ("create (async:%p transport:%p error:%p)", - (gpointer)async, (gpointer)transport, (gpointer)error); + g_trace ("create (async:%p sock:%p error:%p)", + (gpointer)async, (gpointer)sock, (gpointer)error); if (!g_thread_supported()) g_thread_init (NULL); new_async = g_new0 (pgm_async_t, 1); - new_async->transport = transport; + new_async->sock = sock; if (0 != pgm_notify_init (&new_async->commit_notify) || 0 != pgm_notify_init (&new_async->destroy_notify)) { diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/async.h b/3rdparty/openpgm-svn-r1135/pgm/test/async.h index c2b91a7..d801abd 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/async.h +++ b/3rdparty/openpgm-svn-r1135/pgm/test/async.h @@ -24,7 +24,7 @@ #include <errno.h> #include <glib.h> -#include <pgm/pgm.h> +#include <impl/framework.h> #define PGM_ASYNC_ERROR pgm_async_error_quark () @@ -42,7 +42,7 @@ typedef enum typedef struct pgm_async_t pgm_async_t; struct pgm_async_t { - pgm_transport_t* transport; + pgm_sock_t* sock; GThread* thread; GAsyncQueue* commit_queue; pgm_notify_t commit_notify; @@ -56,7 +56,7 @@ typedef int (*pgm_eventfn_t)(gpointer, guint, gpointer); G_BEGIN_DECLS -int pgm_async_create (pgm_async_t**, pgm_transport_t* const, GError**); +int pgm_async_create (pgm_async_t**, pgm_sock_t* const, GError**); int pgm_async_destroy (pgm_async_t* const); GIOStatus pgm_async_recv (pgm_async_t* const, gpointer, const gsize, gsize* const, const int, GError**); gboolean pgm_async_set_nonblocking (pgm_async_t* const, const gboolean); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/dump-json.c b/3rdparty/openpgm-svn-r1135/pgm/test/dump-json.c index 70a7442..adbc217 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/dump-json.c +++ b/3rdparty/openpgm-svn-r1135/pgm/test/dump-json.c @@ -31,8 +31,8 @@ #include <glib.h> -#include <pgm/pgm.h> -#include <pgm/packet_test.h> +#include <impl/framework.h> +#include <impl/packet_test.h> #include "dump-json.h" @@ -184,8 +184,8 @@ verify_ip_header ( } guint ip_header_length = ip->ip_hl * 4; /* IP header length in 32bit octets */ - if (ip_header_length < sizeof(struct ip)) { - printf ("\t\"message\": \"IP: bad IP header length %i, should be at least %" G_GSIZE_FORMAT "lu bytes.\",\n", ip_header_length, sizeof(struct ip)); + if (ip_header_length < sizeof(struct pgm_ip)) { + printf ("\t\"message\": \"IP: bad IP header length %i, should be at least %" G_GSIZE_FORMAT "lu bytes.\",\n", ip_header_length, sizeof(struct pgm_ip)); return -1; } diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/dump-json.h b/3rdparty/openpgm-svn-r1135/pgm/test/dump-json.h index 6fa0f9d..6fa0f9d 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/dump-json.h +++ b/3rdparty/openpgm-svn-r1135/pgm/test/dump-json.h diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/heartbeat_spm.pl b/3rdparty/openpgm-svn-r1135/pgm/test/heartbeat_spm.pl index 60f6266..beb912e 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/heartbeat_spm.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/heartbeat_spm.pl @@ -28,6 +28,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); print "app: publish test data.\n"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/monitor.c b/3rdparty/openpgm-svn-r1135/pgm/test/monitor.c index 6569a55..6569a55 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/monitor.c +++ b/3rdparty/openpgm-svn-r1135/pgm/test/monitor.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/nak.pl b/3rdparty/openpgm-svn-r1135/pgm/test/nak.pl index cb75609..bde24c0 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/nak.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/nak.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $sim->say ("create ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); # to process NAK requests print "app: publish test data.\n"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/nak_cancellation.pl b/3rdparty/openpgm-svn-r1135/pgm/test/nak_cancellation.pl index 6ad36fe..9db12e9 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/nak_cancellation.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/nak_cancellation.pl @@ -41,6 +41,7 @@ $app->say ("set ao NAK_RDATA_IVL 10000"); $app->say ("set ao NAK_NCF_RETRIES 15"); $app->say ("set ao NAK_DATA_RETRIES 10"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); ## capture GSI of test spp @@ -51,6 +52,7 @@ print "mon: odata received.\n"; $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/nak_list.pl b/3rdparty/openpgm-svn-r1135/pgm/test/nak_list.pl index 838dfd5..015db45 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/nak_list.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/nak_list.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $sim->say ("create ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); print "app: publish test data.\n"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/nak_parity.pl b/3rdparty/openpgm-svn-r1135/pgm/test/nak_parity.pl index 50f961b..50f961b 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/nak_parity.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/nak_parity.pl diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/nak_repeat.pl b/3rdparty/openpgm-svn-r1135/pgm/test/nak_repeat.pl index b811fa8..7f3d80e 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/nak_repeat.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/nak_repeat.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $sim->say ("create ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); # to process NAK requests print "app: publish test data.\n"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/ncf.pl b/3rdparty/openpgm-svn-r1135/pgm/test/ncf.pl index e26145f..128db2a 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/ncf.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/ncf.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $sim->say ("create ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); print "app: publish test data.\n"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/ncf_cancellation.pl b/3rdparty/openpgm-svn-r1135/pgm/test/ncf_cancellation.pl index ca23b22..fcfbf2b 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/ncf_cancellation.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/ncf_cancellation.pl @@ -36,6 +36,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); ## capture GSI of test spp @@ -46,6 +47,7 @@ print "mon: odata received.\n"; $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/ncf_list.pl b/3rdparty/openpgm-svn-r1135/pgm/test/ncf_list.pl index 55b1d81..d3082e4 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/ncf_list.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/ncf_list.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $sim->say ("create ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); print "app: publish test data.\n"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/ncf_suppression.pl b/3rdparty/openpgm-svn-r1135/pgm/test/ncf_suppression.pl index c1d42a8..fbb3de7 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/ncf_suppression.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/ncf_suppression.pl @@ -30,6 +30,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); ## capture GSI of test spp @@ -40,6 +41,7 @@ print "mon: odata received.\n"; $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/odata.pl b/3rdparty/openpgm-svn-r1135/pgm/test/odata.pl index 50bcec0..8dd3580 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/odata.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/odata.pl @@ -27,6 +27,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); print "app: publish test data.\n"; $app->say ("send ao ringo"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/odata_completion.pl b/3rdparty/openpgm-svn-r1135/pgm/test/odata_completion.pl index 6b45a47..655aeff 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/odata_completion.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/odata_completion.pl @@ -30,6 +30,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); ## capture GSI of test spp @@ -40,6 +41,7 @@ print "mon: odata received.\n"; $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/odata_jump.pl b/3rdparty/openpgm-svn-r1135/pgm/test/odata_jump.pl index aec4d82..748ff23 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/odata_jump.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/odata_jump.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/odata_jump_parity.pl b/3rdparty/openpgm-svn-r1135/pgm/test/odata_jump_parity.pl index 99179cc..99179cc 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/odata_jump_parity.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/odata_jump_parity.pl diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/odata_number.pl b/3rdparty/openpgm-svn-r1135/pgm/test/odata_number.pl index 2d442dc..e48a7e1 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/odata_number.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/odata_number.pl @@ -27,6 +27,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); print "app: send 1000 data packets ...\n"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/odata_rate.pl b/3rdparty/openpgm-svn-r1135/pgm/test/odata_rate.pl index fb8c7e0..0db4d80 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/odata_rate.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/odata_rate.pl @@ -29,6 +29,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("set ao TXW_MAX_RTE 1500"); $app->say ("bind ao"); +$app->say ("connect ao"); print "app: send 50 data packets ...\n"; my $t0 = [gettimeofday]; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/odata_reception.pl b/3rdparty/openpgm-svn-r1135/pgm/test/odata_reception.pl index ef95974..4c47dc0 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/odata_reception.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/odata_reception.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish ODATA sqn 90,000.\n"; $sim->say ("net send odata ao 90000 90000 ringo"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/on-demand_spm.pl b/3rdparty/openpgm-svn-r1135/pgm/test/on-demand_spm.pl index eb86cf9..eb86cf9 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/on-demand_spm.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/on-demand_spm.pl diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/outofwindow_ncf.pl b/3rdparty/openpgm-svn-r1135/pgm/test/outofwindow_ncf.pl index 4849e36..3e1eb88 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/outofwindow_ncf.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/outofwindow_ncf.pl @@ -30,6 +30,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); ## capture GSI of test spp @@ -40,6 +41,7 @@ print "mon: odata received.\n"; $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion.pl b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion.pl index 8a0cc60..3b290ee 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion.pl @@ -30,6 +30,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); ## capture GSI of test spp @@ -40,6 +41,7 @@ print "mon: odata received.\n"; $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion_parity.pl b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion_parity.pl index 95a6f7b..95a6f7b 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion_parity.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion_parity.pl diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion_parity_var_pktlen.pl b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion_parity_var_pktlen.pl index 9011ea1..9011ea1 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion_parity_var_pktlen.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion_parity_var_pktlen.pl diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_jump.pl b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_jump.pl index f472b33..dbb3e02 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_jump.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_jump.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_reception.pl b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_reception.pl index a26bb4e..3592cc7 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/rdata_reception.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/rdata_reception.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish RDATA sqn 90,000.\n"; $sim->say ("net send rdata ao 90000 90000 ringo"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/sim.c b/3rdparty/openpgm-svn-r1135/pgm/test/sim.c index b0e473b..d600fae 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/sim.c +++ b/3rdparty/openpgm-svn-r1135/pgm/test/sim.c @@ -40,12 +40,14 @@ #include <glib.h> +#include <impl/framework.h> +#include <impl/socket.h> +#include <impl/sqn_list.h> +#include <impl/packet_parse.h> #include <pgm/pgm.h> #include <pgm/backtrace.h> #include <pgm/log.h> #include <pgm/signal.h> -#include <pgm/sqn_list.h> -#include <pgm/packet_parse.h> #include "dump-json.h" #include "async.h" @@ -60,7 +62,7 @@ struct idle_source { struct sim_session { char* name; - pgm_transport_t* transport; + pgm_sock_t* sock; gboolean is_transport_fake; GIOChannel* recv_channel; pgm_async_t* async; @@ -115,16 +117,16 @@ main ( char *argv[] ) { - pgm_error_t* err = NULL; + pgm_error_t* pgm_err = NULL; /* pre-initialise PGM messages module to add hook for GLib logging */ pgm_messages_init(); log_init (); g_message ("sim"); - if (!pgm_init (&err)) { - g_error ("Unable to start PGM engine: %s", (err && err->message) ? err->message : "(null)"); - pgm_error_free (err); + if (!pgm_init (&pgm_err)) { + g_error ("Unable to start PGM engine: %s", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + pgm_error_free (pgm_err); pgm_messages_shutdown(); return EXIT_FAILURE; } @@ -196,9 +198,9 @@ destroy_session ( struct sim_session* sess ) { - printf ("destroying transport \"%s\"\n", sess->name); - pgm_transport_destroy (sess->transport, TRUE); - sess->transport = NULL; + printf ("destroying socket \"%s\"\n", sess->name); + pgm_close (sess->sock, TRUE); + sess->sock = NULL; g_free (sess->name); sess->name = NULL; g_free (sess); @@ -243,137 +245,140 @@ on_startup ( static bool -fake_pgm_transport_create ( - pgm_transport_t** transport, - struct pgm_transport_info_t* tinfo, - G_GNUC_UNUSED pgm_error_t** error +fake_pgm_socket ( + pgm_sock_t**restrict sock, + const sa_family_t family, + const int pgm_sock_type, + const int protocol, + G_GNUC_UNUSED pgm_error_t**restrict error ) { - pgm_transport_t* new_transport; - - g_return_val_if_fail (NULL != transport, FALSE); - g_return_val_if_fail (NULL != tinfo, FALSE); - if (tinfo->ti_sport) g_return_val_if_fail (tinfo->ti_sport != tinfo->ti_dport, FALSE); - if (tinfo->ti_udp_encap_ucast_port) - g_return_val_if_fail (tinfo->ti_udp_encap_mcast_port, FALSE); - else if (tinfo->ti_udp_encap_mcast_port) - g_return_val_if_fail (tinfo->ti_udp_encap_ucast_port, FALSE); - g_return_val_if_fail (tinfo->ti_recv_addrs_len > 0, FALSE); - g_return_val_if_fail (tinfo->ti_recv_addrs_len <= IP_MAX_MEMBERSHIPS, FALSE); - g_return_val_if_fail (NULL != tinfo->ti_recv_addrs, FALSE); - g_return_val_if_fail (1 == tinfo->ti_send_addrs_len, FALSE); - g_return_val_if_fail (NULL != tinfo->ti_send_addrs, FALSE); - for (unsigned i = 0; i < tinfo->ti_recv_addrs_len; i++) - { - g_return_val_if_fail (tinfo->ti_recv_addrs[i].gsr_group.ss_family == tinfo->ti_recv_addrs[0].gsr_group.ss_family, -FALSE); - g_return_val_if_fail (tinfo->ti_recv_addrs[i].gsr_group.ss_family == tinfo->ti_recv_addrs[i].gsr_source.ss_family, -FALSE); - } - g_return_val_if_fail (tinfo->ti_send_addrs[0].gsr_group.ss_family == tinfo->ti_send_addrs[0].gsr_source.ss_family, -FALSE); - -/* create transport object */ - new_transport = g_new0 (pgm_transport_t, 1); - -/* transport defaults */ - new_transport->can_send_data = TRUE; - new_transport->can_send_nak = FALSE; - new_transport->can_recv_data = TRUE; - - memcpy (&new_transport->tsi.gsi, &tinfo->ti_gsi, sizeof(pgm_gsi_t)); - new_transport->dport = g_htons (tinfo->ti_dport); - if (tinfo->ti_sport) { - new_transport->tsi.sport = tinfo->ti_sport; - } else { - do { - new_transport->tsi.sport = g_htons (g_random_int_range (0, UINT16_MAX)); - } while (new_transport->tsi.sport == new_transport->dport); - } - -/* network data ports */ - new_transport->udp_encap_ucast_port = tinfo->ti_udp_encap_ucast_port; - new_transport->udp_encap_mcast_port = tinfo->ti_udp_encap_mcast_port; - -/* copy network parameters */ - memcpy (&new_transport->send_gsr, &tinfo->ti_send_addrs[0], sizeof(struct group_source_req)); - for (unsigned i = 0; i < tinfo->ti_recv_addrs_len; i++) - { - memcpy (&new_transport->recv_gsr[i], &tinfo->ti_recv_addrs[i], sizeof(struct group_source_req)); - ((struct sockaddr_in*)&new_transport->recv_gsr[i].gsr_group)->sin_port = g_htons (new_transport->udp_encap_mcast_port); - } - new_transport->recv_gsr_len = tinfo->ti_recv_addrs_len; + pgm_sock_t* new_sock; + + g_return_val_if_fail (NULL != sock, FALSE); + g_return_val_if_fail (AF_INET == family || AF_INET6 == family, FALSE); + g_return_val_if_fail (SOCK_SEQPACKET == pgm_sock_type, FALSE); + g_return_val_if_fail (IPPROTO_UDP == protocol || IPPROTO_PGM == protocol, FALSE); + + new_sock = pgm_new0 (pgm_sock_t, 1); + new_sock->family = family; + new_sock->socket_type = pgm_sock_type; + new_sock->protocol = protocol; + new_sock->can_send_data = TRUE; + new_sock->can_send_nak = TRUE; + new_sock->can_recv_data = TRUE; + new_sock->dport = DEFAULT_DATA_DESTINATION_PORT; + new_sock->tsi.sport = DEFAULT_DATA_SOURCE_PORT; + new_sock->adv_mode = 0; /* advance with time */ + +/* PGMCC */ + new_sock->acker_nla.ss_family = family; /* open sockets to implement PGM */ - int socket_type, protocol; - if (new_transport->udp_encap_ucast_port) { - puts ("opening UDP encapsulated sockets."); + int socket_type; + if (IPPROTO_UDP == new_sock->protocol) { + puts ("Opening UDP encapsulated sockets."); socket_type = SOCK_DGRAM; - protocol = IPPROTO_UDP; + new_sock->udp_encap_ucast_port = DEFAULT_UDP_ENCAP_UCAST_PORT; + new_sock->udp_encap_mcast_port = DEFAULT_UDP_ENCAP_MCAST_PORT; } else { - puts ("opening raw sockets."); + puts ("Opening raw sockets."); socket_type = SOCK_RAW; - protocol = IPPROTO_PGM; } - if ((new_transport->recv_sock = socket (new_transport->recv_gsr[0].gsr_group.ss_family, - socket_type, - protocol)) < 0) + if ((new_sock->recv_sock = socket (new_sock->family, + socket_type, + new_sock->protocol)) == PGM_INVALID_SOCKET) { - if (errno == EPERM && 0 != getuid()) { - g_critical ("PGM protocol requires this program to run as superuser."); + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + "Creating receive socket: %s", + pgm_sock_strerror (save_errno)); +#ifndef _WIN32 + if (EPERM == save_errno) { + g_critical ("PGM protocol requires CAP_NET_RAW capability, e.g. sudo execcap 'cap_net_raw=ep'"); } +#endif goto err_destroy; } - if ((new_transport->send_sock = socket (new_transport->send_gsr.gsr_group.ss_family, - socket_type, - protocol)) < 0) + if ((new_sock->send_sock = socket (new_sock->family, + socket_type, + new_sock->protocol)) == PGM_INVALID_SOCKET) { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + "Creating send socket: %s", + pgm_sock_strerror (save_errno)); goto err_destroy; } - if ((new_transport->send_with_router_alert_sock = socket (new_transport->send_gsr.gsr_group.ss_family, - socket_type, - protocol)) < 0) + if ((new_sock->send_with_router_alert_sock = socket (new_sock->family, + socket_type, + new_sock->protocol)) == PGM_INVALID_SOCKET) { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + "Creating IP Router Alert (RFC 2113) send socket: %s", + pgm_sock_strerror (save_errno)); goto err_destroy; } - *transport = new_transport; - return TRUE; + *sock = new_sock; + + puts ("PGM socket successfully created."); + return TRUE; err_destroy: - if (new_transport->recv_sock) { - close(new_transport->recv_sock); - new_transport->recv_sock = 0; + if (PGM_INVALID_SOCKET != new_sock->recv_sock) { + if (PGM_SOCKET_ERROR == pgm_closesocket (new_sock->recv_sock)) { + const int save_errno = pgm_sock_errno(); + g_warning ("Close on receive socket failed: %s", + pgm_sock_strerror (save_errno)); + } + new_sock->recv_sock = PGM_INVALID_SOCKET; } - if (new_transport->send_sock) { - close(new_transport->send_sock); - new_transport->send_sock = 0; + if (PGM_INVALID_SOCKET != new_sock->send_sock) { + if (PGM_SOCKET_ERROR == pgm_closesocket (new_sock->send_sock)) { + const int save_errno = pgm_sock_errno(); + g_warning ("Close on send socket failed: %s", + pgm_sock_strerror (save_errno)); + } + new_sock->send_sock = PGM_INVALID_SOCKET; } - if (new_transport->send_with_router_alert_sock) { - close(new_transport->send_with_router_alert_sock); - new_transport->send_with_router_alert_sock = 0; + if (PGM_INVALID_SOCKET != new_sock->send_with_router_alert_sock) { + if (PGM_SOCKET_ERROR == pgm_closesocket (new_sock->send_with_router_alert_sock)) { + const int save_errno = pgm_sock_errno(); + g_warning ("Close on IP Router Alert (RFC 2113) send socket failed: %s", + pgm_sock_strerror (save_errno)); + } + new_sock->send_with_router_alert_sock = PGM_INVALID_SOCKET; } - - g_free (new_transport); - new_transport = NULL; + pgm_free (new_sock); return FALSE; } static gboolean on_io_data ( - GIOChannel* source, + GIOChannel* source, G_GNUC_UNUSED GIOCondition condition, - gpointer data + gpointer data ) { - pgm_transport_t* transport = data; + pgm_sock_t* sock = data; - struct pgm_sk_buff_t* skb = pgm_alloc_skb (transport->max_tpdu); + struct pgm_sk_buff_t* skb = pgm_alloc_skb (sock->max_tpdu); int fd = g_io_channel_unix_get_fd(source); struct sockaddr_storage src_addr; socklen_t src_addr_len = sizeof(src_addr); - skb->len = recvfrom(fd, skb->head, transport->max_tpdu, MSG_DONTWAIT, (struct sockaddr*)&src_addr, &src_addr_len); + skb->len = recvfrom(fd, skb->head, sock->max_tpdu, MSG_DONTWAIT, (struct sockaddr*)&src_addr, &src_addr_len); printf ("%i bytes received from %s.\n", skb->len, inet_ntoa(((struct sockaddr_in*)&src_addr)->sin_addr)); @@ -381,7 +386,7 @@ on_io_data ( fflush (stdout); /* parse packet to maintain peer database */ - if (transport->udp_encap_ucast_port) { + if (sock->udp_encap_ucast_port) { if (!pgm_parse_udp_encap (skb, NULL)) goto out; } else { @@ -390,20 +395,20 @@ on_io_data ( goto out; } - if (pgm_is_upstream (skb->pgm_header->pgm_type) || - pgm_is_peer (skb->pgm_header->pgm_type)) + if (PGM_IS_UPSTREAM (skb->pgm_header->pgm_type) || + PGM_IS_PEER (skb->pgm_header->pgm_type)) goto out; /* ignore */ /* downstream = source to receivers */ - if (!pgm_is_downstream (skb->pgm_header->pgm_type)) + if (!PGM_IS_DOWNSTREAM (skb->pgm_header->pgm_type)) goto out; /* pgm packet DPORT contains our transport DPORT */ - if (skb->pgm_header->pgm_dport != transport->dport) + if (skb->pgm_header->pgm_dport != sock->dport) goto out; /* search for TSI peer context or create a new one */ - pgm_peer_t* sender = pgm_hashtable_lookup (transport->peers_hashtable, &skb->tsi); + pgm_peer_t* sender = pgm_hashtable_lookup (sock->peers_hashtable, &skb->tsi); if (sender == NULL) { printf ("new peer, tsi %s, local nla %s\n", @@ -411,12 +416,12 @@ on_io_data ( inet_ntoa(((struct sockaddr_in*)&src_addr)->sin_addr)); pgm_peer_t* peer = g_new0 (pgm_peer_t, 1); - peer->transport = transport; + peer->sock = sock; memcpy (&peer->tsi, &skb->tsi, sizeof(pgm_tsi_t)); ((struct sockaddr_in*)&peer->nla)->sin_addr.s_addr = INADDR_ANY; memcpy (&peer->local_nla, &src_addr, src_addr_len); - pgm_hashtable_insert (transport->peers_hashtable, &peer->tsi, peer); + pgm_hashtable_insert (sock->peers_hashtable, &peer->tsi, peer); sender = peer; } @@ -441,211 +446,401 @@ out: static bool -fake_pgm_transport_bind ( - pgm_transport_t* transport, - G_GNUC_UNUSED pgm_error_t** error - ) +fake_pgm_bind3 ( + pgm_sock_t* restrict sock, + const struct pgm_sockaddr_t*const restrict sockaddr, + const socklen_t sockaddrlen, + const struct pgm_interface_req_t*const send_req, /* only use gr_interface and gr_group::sin6_scope */ + const socklen_t send_req_len, + const struct pgm_interface_req_t*const recv_req, + const socklen_t recv_req_len, + pgm_error_t** restrict error /* maybe NULL */ + ) { - g_return_val_if_fail (NULL != transport, FALSE); - g_return_val_if_fail (!transport->is_bound, FALSE); + g_return_val_if_fail (NULL != sock, FALSE); + g_return_val_if_fail (NULL != sockaddr, FALSE); + g_return_val_if_fail (0 != sockaddrlen, FALSE); + if (sockaddr->sa_addr.sport) pgm_return_val_if_fail (sockaddr->sa_addr.sport != sockaddr->sa_port, FALSE); + g_return_val_if_fail (NULL != send_req, FALSE); + g_return_val_if_fail (sizeof(struct pgm_interface_req_t) == send_req_len, FALSE); + g_return_val_if_fail (NULL != recv_req, FALSE); + g_return_val_if_fail (sizeof(struct pgm_interface_req_t) == recv_req_len, FALSE); + + if (sock->is_bound || + sock->is_destroyed) + { + pgm_return_val_if_reached (FALSE); + } + + memcpy (&sock->tsi, &sockaddr->sa_addr, sizeof(pgm_tsi_t)); + sock->dport = htons (sockaddr->sa_port); + if (sock->tsi.sport) { + sock->tsi.sport = htons (sock->tsi.sport); + } else { + do { + sock->tsi.sport = htons (pgm_random_int_range (0, UINT16_MAX)); + } while (sock->tsi.sport == sock->dport); + } + +/* UDP encapsulation port */ + if (sock->udp_encap_mcast_port) { + ((struct sockaddr_in*)&sock->send_gsr.gsr_group)->sin_port = htons (sock->udp_encap_mcast_port); + } + +/* pseudo-random number generator for back-off intervals */ + pgm_rand_create (&sock->rand_); + +/* PGM Children support of POLLs requires 32-bit random node identifier RAND_NODE_ID */ + if (sock->can_recv_data) { + sock->rand_node_id = pgm_rand_int (&sock->rand_); + } + +/* determine IP header size for rate regulation engine & stats */ + sock->iphdr_len = (AF_INET == sock->family) ? sizeof(struct pgm_ip) : sizeof(struct pgm_ip6_hdr); + pgm_trace (PGM_LOG_ROLE_NETWORK,"Assuming IP header size of %zu bytes", sock->iphdr_len); + + if (sock->udp_encap_ucast_port) { + const size_t udphdr_len = sizeof(struct pgm_udphdr); + printf ("Assuming UDP header size of %zu bytes\n", udphdr_len); + sock->iphdr_len += udphdr_len; + } + + const sa_family_t pgmcc_family = sock->use_pgmcc ? sock->family : 0; + sock->max_tsdu = sock->max_tpdu - sock->iphdr_len - pgm_pkt_offset (FALSE, pgmcc_family); + sock->max_tsdu_fragment = sock->max_tpdu - sock->iphdr_len - pgm_pkt_offset (TRUE, pgmcc_family); + const unsigned max_fragments = sock->txw_sqns ? MIN( PGM_MAX_FRAGMENTS, sock->txw_sqns ) : PGM_MAX_FRAGMENTS; + sock->max_apdu = MIN( PGM_MAX_APDU, max_fragments * sock->max_tsdu_fragment ); /* create peer list */ - transport->peers_hashtable = pgm_hashtable_new (pgm_tsi_hash, pgm_tsi_equal); + if (sock->can_recv_data) { + sock->peers_hashtable = pgm_hashtable_new (pgm_tsi_hash, pgm_tsi_equal); + pgm_assert (NULL != sock->peers_hashtable); + } -/* bind udp unicast sockets to interfaces, note multicast on a bound interface is - * fruity on some platforms so callee should specify any interface. - * - * after binding default interfaces (0.0.0.0) are resolved +/* IP/PGM only */ + { + const sa_family_t recv_family = sock->family; + if (AF_INET == recv_family) + { +/* include IP header only for incoming data, only works for IPv4 */ + puts ("Request IP headers."); + if (PGM_SOCKET_ERROR == pgm_sockaddr_hdrincl (sock->recv_sock, recv_family, TRUE)) + { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + "Enabling IP header in front of user data: %s", + pgm_sock_strerror (save_errno)); + return FALSE; + } + } + else + { + pgm_assert (AF_INET6 == recv_family); + puts ("Request socket packet-info."); + if (PGM_SOCKET_ERROR == pgm_sockaddr_pktinfo (sock->recv_sock, recv_family, TRUE)) + { + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + "Enabling receipt of control message per incoming datagram: %s", + pgm_sock_strerror (save_errno)); + return FALSE; + } + } + } + + union { + struct sockaddr sa; + struct sockaddr_in s4; + struct sockaddr_in6 s6; + struct sockaddr_storage ss; + } recv_addr, recv_addr2, send_addr, send_with_router_alert_addr; + +#ifdef CONFIG_BIND_INADDR_ANY +/* force default interface for bind-only, source address is still valid for multicast membership. + * effectively same as running getaddrinfo(hints = {ai_flags = AI_PASSIVE}) */ - struct sockaddr_storage recv_addr; - memset (&recv_addr, 0, sizeof(recv_addr)); - ((struct sockaddr*)&recv_addr)->sa_family = AF_INET; - ((struct sockaddr_in*)&recv_addr)->sin_port = transport->udp_encap_ucast_port; - ((struct sockaddr_in*)&recv_addr)->sin_addr.s_addr = INADDR_ANY; - - int retval = bind (transport->recv_sock, - (struct sockaddr*)&recv_addr, - pgm_sockaddr_len((struct sockaddr*)&recv_addr)); - if (retval < 0) { - goto out; + if (AF_INET == sock->family) { + memset (&recv_addr.s4, 0, sizeof(struct sockaddr_in)); + recv_addr.s4.sin_family = AF_INET; + recv_addr.s4.sin_addr.s_addr = INADDR_ANY; + } else { + memset (&recv_addr.s6, 0, sizeof(struct sockaddr_in6)); + recv_addr.s6.sin6_family = AF_INET6; + recv_addr.s6.sin6_addr = in6addr_any; + } + puts ("Binding receive socket to INADDR_ANY."); +#else + if (!pgm_if_indextoaddr (recv_req->ir_interface, + sock->family, + recv_req->ir_scope_id, + &recv_addr.sa, + error)) + { + return FALSE; + } + printf ("Binding receive socket to interface index %u scope %u\n"), + recv_req->ir_interface, + recv_req->ir_scope_id); + +#endif /* CONFIG_BIND_INADDR_ANY */ + + memcpy (&recv_addr2.sa, &recv_addr.sa, pgm_sockaddr_len (&recv_addr.sa)); + ((struct sockaddr_in*)&recv_addr)->sin_port = htons (sock->udp_encap_mcast_port); + if (PGM_SOCKET_ERROR == bind (sock->recv_sock, + &recv_addr.sa, + pgm_sockaddr_len (&recv_addr.sa))) + { + char addr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&recv_addr, addr, sizeof(addr)); + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + "Binding receive socket to address %s: %s", + addr, + pgm_sock_strerror (save_errno)); + return FALSE; + } + + { + char s[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&recv_addr, s, sizeof(s)); + printf ("bind succeeded on recv_gsr[0] interface %s\n", s); } - struct sockaddr_storage send_addr, send_with_router_alert_addr; - memset (&send_addr, 0, sizeof(send_addr)); - if (!pgm_if_indextoaddr (transport->send_gsr.gsr_interface, - transport->send_gsr.gsr_group.ss_family, - pgm_sockaddr_scope_id((struct sockaddr*)&transport->send_gsr.gsr_group), - (struct sockaddr*)&send_addr, - NULL)) +/* keep a copy of the original address source to re-use for router alert bind */ + memset (&send_addr, 0, sizeof(send_addr)); + + if (!pgm_if_indextoaddr (send_req->ir_interface, + sock->family, + send_req->ir_scope_id, + (struct sockaddr*)&send_addr, + error)) + { + return FALSE; + } + else { - goto out; + printf ("Binding send socket to interface index %u scope %u\n", + send_req->ir_interface, + send_req->ir_scope_id); } - memcpy (&send_with_router_alert_addr, &send_addr, pgm_sockaddr_len((struct sockaddr*)&send_addr)); - retval = bind (transport->send_sock, - (struct sockaddr*)&send_addr, - pgm_sockaddr_len((struct sockaddr*)&send_addr)); - if (retval < 0) - goto out; -/* resolve bound address if 0.0.0.0 */ - if (((struct sockaddr_in*)&send_addr)->sin_addr.s_addr == INADDR_ANY) + memcpy (&send_with_router_alert_addr, &send_addr, pgm_sockaddr_len ((struct sockaddr*)&send_addr)); + if (PGM_SOCKET_ERROR == bind (sock->send_sock, + (struct sockaddr*)&send_addr, + pgm_sockaddr_len ((struct sockaddr*)&send_addr))) { - if (!pgm_if_getnodeaddr (AF_INET, (struct sockaddr*)&send_addr, sizeof(send_addr), NULL)) - goto out; + char addr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&send_addr, addr, sizeof(addr)); + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + "Binding send socket to address %s: %s", + addr, + pgm_sock_strerror (save_errno)); + return FALSE; } - retval = bind (transport->send_with_router_alert_sock, - (struct sockaddr*)&send_with_router_alert_addr, - pgm_sockaddr_len((struct sockaddr*)&send_with_router_alert_addr)); - if (retval < 0) - goto out; +/* resolve bound address if 0.0.0.0 */ + if (AF_INET == send_addr.ss.ss_family) + { + if ((INADDR_ANY == ((struct sockaddr_in*)&send_addr)->sin_addr.s_addr) && + !pgm_if_getnodeaddr (AF_INET, (struct sockaddr*)&send_addr, sizeof(send_addr), error)) + { + return FALSE; + } + } + else if ((memcmp (&in6addr_any, &((struct sockaddr_in6*)&send_addr)->sin6_addr, sizeof(in6addr_any)) == 0) && + !pgm_if_getnodeaddr (AF_INET6, (struct sockaddr*)&send_addr, sizeof(send_addr), error)) + { + return FALSE; + } - memcpy (&transport->send_addr, &send_addr, pgm_sockaddr_len((struct sockaddr*)&send_addr)); + { + char s[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&send_addr, s, sizeof(s)); + printf ("bind succeeded on send_gsr interface %s\n", s); + } -/* receiving groups (multiple) */ - for (unsigned i = 0; i < transport->recv_gsr_len; i++) - { - struct group_source_req* p = &transport->recv_gsr[i]; - int optname = (pgm_sockaddr_cmp ((struct sockaddr*)&p->gsr_group, (struct sockaddr*)&p->gsr_source) == 0) - ? MCAST_JOIN_GROUP : MCAST_JOIN_SOURCE_GROUP; - socklen_t plen = MCAST_JOIN_GROUP == optname ? sizeof(struct group_req) : sizeof(struct group_source_req); - retval = setsockopt(transport->recv_sock, SOL_IP, optname, p, plen); - if (retval < 0) - goto out; - } + if (PGM_SOCKET_ERROR == bind (sock->send_with_router_alert_sock, + (struct sockaddr*)&send_with_router_alert_addr, + pgm_sockaddr_len((struct sockaddr*)&send_with_router_alert_addr))) + { + char addr[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&send_with_router_alert_addr, addr, sizeof(addr)); + const int save_errno = pgm_sock_errno(); + pgm_set_error (error, + PGM_ERROR_DOMAIN_SOCKET, + pgm_error_from_sock_errno (save_errno), + "Binding IP Router Alert (RFC 2113) send socket to address %s: %s", + addr, + pgm_sock_strerror (save_errno)); + return FALSE; + } -/* send group (singular) */ - retval = pgm_sockaddr_multicast_if (transport->send_sock, (struct sockaddr*)&transport->send_addr, transport->send_gsr.gsr_interface); - if (retval < 0) - goto out; + { + char s[INET6_ADDRSTRLEN]; + pgm_sockaddr_ntop ((struct sockaddr*)&send_with_router_alert_addr, s, sizeof(s)); + printf ("bind (router alert) succeeded on send_gsr interface %s\n", s); + } - retval = pgm_sockaddr_multicast_if (transport->send_with_router_alert_sock, (struct sockaddr*)&transport->send_addr, transport->send_gsr.gsr_interface); - if (retval < 0) - goto out; +/* save send side address for broadcasting as source nla */ + memcpy (&sock->send_addr, &send_addr, pgm_sockaddr_len ((struct sockaddr*)&send_addr)); -/* multicast loopback */ - retval = pgm_sockaddr_multicast_loop (transport->recv_sock, transport->recv_gsr[0].gsr_group.ss_family, FALSE); - if (retval < 0) - goto out; - retval = pgm_sockaddr_multicast_loop (transport->send_sock, transport->send_gsr.gsr_group.ss_family, FALSE); - if (retval < 0) - goto out; - retval = pgm_sockaddr_multicast_loop (transport->send_with_router_alert_sock, transport->send_gsr.gsr_group.ss_family, FALSE); - if (retval < 0) - goto out; + sock->is_controlled_spm = FALSE; + sock->is_controlled_odata = FALSE; + sock->is_controlled_rdata = FALSE; -/* multicast ttl: many crappy network devices go CPU ape with TTL=1, 16 is a popular alternative */ - retval = pgm_sockaddr_multicast_hops (transport->recv_sock, transport->recv_gsr[0].gsr_group.ss_family, transport->hops); - if (retval < 0) - goto out; - retval = pgm_sockaddr_multicast_hops (transport->send_sock, transport->send_gsr.gsr_group.ss_family, transport->hops); - if (retval < 0) - goto out; - retval = pgm_sockaddr_multicast_hops (transport->send_with_router_alert_sock, transport->send_gsr.gsr_group.ss_family, transport->hops); - if (retval < 0) - goto out; +/* allocate first incoming packet buffer */ + sock->rx_buffer = pgm_alloc_skb (sock->max_tpdu); -/* set Expedited Forwarding PHB for network elements, no ECN. - * - * codepoint 101110 (RFC 3246) - */ - int dscp = 0x2e << 2; - retval = pgm_sockaddr_tos (transport->send_sock, transport->send_gsr.gsr_group.ss_family, dscp); - if (retval < 0) - goto out; - retval = pgm_sockaddr_tos (transport->send_with_router_alert_sock, transport->send_gsr.gsr_group.ss_family, dscp); - if (retval < 0) - goto out; +/* bind complete */ + sock->is_bound = TRUE; /* cleanup */ - transport->is_bound = TRUE; - return TRUE; + puts ("PGM socket successfully bound."); + return TRUE; +} -out: - return FALSE; +static +bool +fake_pgm_bind ( + pgm_sock_t* restrict sock, + const struct pgm_sockaddr_t*const restrict sockaddr, + const socklen_t sockaddrlen, + pgm_error_t** restrict error + ) +{ + struct pgm_interface_req_t null_req; + memset (&null_req, 0, sizeof(null_req)); + return fake_pgm_bind3 (sock, sockaddr, sockaddrlen, &null_req, sizeof(null_req), &null_req, sizeof(null_req), error); } static bool -fake_pgm_transport_destroy ( - pgm_transport_t* transport, +fake_pgm_connect ( + pgm_sock_t* restrict sock, + G_GNUC_UNUSED pgm_error_t** restrict error /* maybe NULL */ + ) +{ + g_return_val_if_fail (sock != NULL, FALSE); + g_return_val_if_fail (sock->recv_gsr_len > 0, FALSE); +#ifdef CONFIG_TARGET_WINE + g_return_val_if_fail (sock->recv_gsr_len == 1, FALSE); +#endif + for (unsigned i = 0; i < sock->recv_gsr_len; i++) + { + g_return_val_if_fail (sock->recv_gsr[i].gsr_group.ss_family == sock->recv_gsr[0].gsr_group.ss_family, FALSE); + g_return_val_if_fail (sock->recv_gsr[i].gsr_group.ss_family == sock->recv_gsr[i].gsr_source.ss_family, FALSE); + } + g_return_val_if_fail (sock->send_gsr.gsr_group.ss_family == sock->recv_gsr[0].gsr_group.ss_family, FALSE); +/* state */ + if (PGM_UNLIKELY(sock->is_connected || !sock->is_bound || sock->is_destroyed)) { + g_return_val_if_reached (FALSE); + } + + sock->next_poll = pgm_time_update_now() + pgm_secs( 30 ); + sock->is_connected = TRUE; + +/* cleanup */ + puts ("PGM socket successfully connected."); + return TRUE; +} + + +static +bool +fake_pgm_close ( + pgm_sock_t* sock, G_GNUC_UNUSED bool flush ) { - g_return_val_if_fail (transport != NULL, FALSE); + g_return_val_if_fail (sock != NULL, FALSE); + g_return_val_if_fail (!sock->is_destroyed, FALSE); +/* flag existing calls */ + sock->is_destroyed = TRUE; +/* cancel running blocking operations */ + if (PGM_INVALID_SOCKET != sock->recv_sock) { + puts ("Closing receive socket."); + pgm_closesocket (sock->recv_sock); + sock->recv_sock = PGM_INVALID_SOCKET; + } + if (PGM_INVALID_SOCKET != sock->send_sock) { + puts ("Closing send socket."); + pgm_closesocket (sock->send_sock); + sock->send_sock = PGM_INVALID_SOCKET; + } + if (sock->peers_hashtable) { + pgm_hashtable_destroy (sock->peers_hashtable); + sock->peers_hashtable = NULL; + } + if (sock->peers_list) { + do { + pgm_list_t* next = sock->peers_list->next; + pgm_peer_unref ((pgm_peer_t*)sock->peers_list->data); - if (transport->recv_sock) { - puts ("closing receive socket."); - close(transport->recv_sock); - transport->recv_sock = 0; + sock->peers_list = next; + } while (sock->peers_list); + } + if (PGM_INVALID_SOCKET != sock->send_with_router_alert_sock) { + puts ("Closing send with router alert socket."); + pgm_closesocket (sock->send_with_router_alert_sock); + sock->send_with_router_alert_sock = PGM_INVALID_SOCKET; } - if (transport->send_sock) { - puts ("closing send socket."); - close(transport->send_sock); - transport->send_sock = 0; + if (sock->spm_heartbeat_interval) { + puts ("freeing SPM heartbeat interval data."); + g_free (sock->spm_heartbeat_interval); + sock->spm_heartbeat_interval = NULL; } - if (transport->send_with_router_alert_sock) { - puts ("closing send with router alert socket."); - close(transport->send_with_router_alert_sock); - transport->send_with_router_alert_sock = 0; + if (sock->rx_buffer) { + puts ("freeing receive buffer."); + pgm_free_skb (sock->rx_buffer); + sock->rx_buffer = NULL; } - g_free (transport); + + g_free (sock); return TRUE; } static void session_create ( - char* name, + char* session_name, gboolean is_fake ) { - struct pgm_transport_info_t hints = { - .ti_family = AF_INET - }, *res = NULL; - pgm_error_t* err = NULL; + pgm_error_t* pgm_err = NULL; gboolean status; /* check for duplicate */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess != NULL) { - puts ("FAILED: duplicate session"); + printf ("FAILED: duplicate session name '%s'\n", session_name); return; } /* create new and fill in bits */ sess = g_new0(struct sim_session, 1); - sess->name = g_memdup (name, strlen(name)+1); - - if (!pgm_if_get_transport_info (g_network, &hints, &res, &err)) { - printf ("FAILED: pgm_if_get_transport_info(): %s\n", (err && err->message) ? err->message : "(null)"); - pgm_error_free (err); - goto err_free; - } - - if (!pgm_gsi_create_from_hostname (&res->ti_gsi, &err)) { - printf ("FAILED: pgm_gsi_create_from_hostname(): %s\n", (err && err->message) ? err->message : "(null)"); - pgm_error_free (err); - pgm_if_free_transport_info (res); - goto err_free; - } + sess->name = g_memdup (session_name, strlen(session_name)+1); - res->ti_dport = g_port; - res->ti_sport = 0; if (is_fake) { sess->is_transport_fake = TRUE; - status = fake_pgm_transport_create (&sess->transport, res, &err); - } else - status = pgm_transport_create (&sess->transport, res, &err); + status = fake_pgm_socket (&sess->sock, AF_INET, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err); + } else { + status = pgm_socket (&sess->sock, AF_INET, SOCK_SEQPACKET, IPPROTO_PGM, &pgm_err); + } if (!status) { - printf ("FAILED: pgm_transport_create(): %s\n", (err && err->message) ? err->message : "(null)"); - pgm_error_free (err); - pgm_if_free_transport_info (res); + printf ("FAILED: pgm_socket(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + pgm_error_free (pgm_err); goto err_free; } - pgm_if_free_transport_info (res); - /* success */ g_hash_table_insert (g_sessions, sess->name, sess); g_sessions_list = g_list_prepend (g_sessions_list, sess); @@ -661,78 +856,234 @@ err_free: static void session_set_fec ( - char* name, - guint default_n, - guint default_k + char* session_name, + guint block_size, + guint group_size ) { /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - pgm_transport_set_fec (sess->transport, FALSE /* pro-active */, TRUE /* on-demand */, TRUE /* varpkt-len */, default_n, default_k); - puts ("READY"); + if (block_size > UINT8_MAX || + group_size > UINT8_MAX) + { + puts ("FAILED: value out of bounds"); + return; + } + + const struct pgm_fecinfo_t fecinfo = { + .block_size = block_size, + .proactive_packets = 0, + .group_size = group_size, + .ondemand_parity_enabled = TRUE, + .var_pktlen_enabled = TRUE + }; + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_USE_FEC, &fecinfo, sizeof(fecinfo))) + printf ("FAILED: set FEC = RS(%d, %d)\n", block_size, group_size); + else + puts ("READY"); } static void session_bind ( - char* name + char* session_name ) { + pgm_error_t* pgm_err = NULL; + /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - pgm_transport_set_nonblocking (sess->transport, TRUE); - pgm_sockaddr_nonblocking (sess->transport->send_sock, FALSE); - pgm_transport_set_max_tpdu (sess->transport, g_max_tpdu); - pgm_transport_set_txw_sqns (sess->transport, g_sqns); - pgm_transport_set_rxw_sqns (sess->transport, g_sqns); - pgm_transport_set_hops (sess->transport, 16); - pgm_transport_set_ambient_spm (sess->transport, pgm_secs(30)); - guint spm_heartbeat[] = { pgm_msecs(100), pgm_msecs(100), pgm_msecs(100), pgm_msecs(100), pgm_msecs(1300), pgm_secs(7), pgm_secs(16), pgm_secs(25), pgm_secs(30) }; - pgm_transport_set_heartbeat_spm (sess->transport, spm_heartbeat, G_N_ELEMENTS(spm_heartbeat)); - pgm_transport_set_peer_expiry (sess->transport, pgm_secs(300)); - pgm_transport_set_spmr_expiry (sess->transport, pgm_msecs(250)); - pgm_transport_set_nak_bo_ivl (sess->transport, pgm_msecs(50)); - pgm_transport_set_nak_rpt_ivl (sess->transport, pgm_secs(2)); - pgm_transport_set_nak_rdata_ivl (sess->transport, pgm_secs(2)); - pgm_transport_set_nak_data_retries (sess->transport, 50); - pgm_transport_set_nak_ncf_retries (sess->transport, 50); - - pgm_error_t* err = NULL; - gboolean status; - if (sess->is_transport_fake) - status = fake_pgm_transport_bind (sess->transport, &err); - else - status = pgm_transport_bind (sess->transport, &err); +/* Use RFC 2113 tagging for PGM Router Assist */ + const int no_router_assist = 0; + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_IP_ROUTER_ALERT, &no_router_assist, sizeof(no_router_assist))) + puts ("FAILED: disable IP_ROUTER_ALERT"); + +/* set PGM parameters */ + const int send_and_receive = 0, + active = 0, + mtu = g_max_tpdu, + txw_sqns = g_sqns, + rxw_sqns = g_sqns, + ambient_spm = pgm_secs (30), + heartbeat_spm[] = { pgm_msecs (100), + pgm_msecs (100), + pgm_msecs (100), + pgm_msecs (100), + pgm_msecs (1300), + pgm_secs (7), + pgm_secs (16), + pgm_secs (25), + pgm_secs (30) }, + peer_expiry = pgm_secs (300), + spmr_expiry = pgm_msecs (250), + nak_bo_ivl = pgm_msecs (50), + nak_rpt_ivl = pgm_secs (2), + nak_rdata_ivl = pgm_secs (2), + nak_data_retries = 50, + nak_ncf_retries = 50; + + g_assert (G_N_ELEMENTS(heartbeat_spm) > 0); + + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_SEND_ONLY, &send_and_receive, sizeof(send_and_receive))) + puts ("FAILED: set bi-directional transport"); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_RECV_ONLY, &send_and_receive, sizeof(send_and_receive))) + puts ("FAILED: set bi-directional transport"); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_PASSIVE, &active, sizeof(active))) + puts ("FAILED: set active transport"); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_MTU, &mtu, sizeof(mtu))) + printf ("FAILED: set MAX_TPDU = %d bytes\n", mtu); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_TXW_SQNS, &txw_sqns, sizeof(txw_sqns))) + printf ("FAILED: set TXW_SQNS = %d\n", txw_sqns); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_RXW_SQNS, &rxw_sqns, sizeof(rxw_sqns))) + printf ("FAILED: set RXW_SQNS = %d\n", rxw_sqns); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_AMBIENT_SPM, &ambient_spm, sizeof(ambient_spm))) + printf ("FAILED: set AMBIENT_SPM = %ds\n", (int)pgm_to_secs (ambient_spm)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_HEARTBEAT_SPM, &heartbeat_spm, sizeof(heartbeat_spm))) + { + char buffer[1024]; + sprintf (buffer, "%d", heartbeat_spm[0]); + for (unsigned i = 1; i < G_N_ELEMENTS(heartbeat_spm); i++) { + char t[1024]; + sprintf (t, ", %d", heartbeat_spm[i]); + strcat (buffer, t); + } + printf ("FAILED: set HEARTBEAT_SPM = { %s }\n", buffer); + } + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_PEER_EXPIRY, &peer_expiry, sizeof(peer_expiry))) + printf ("FAILED: set PEER_EXPIRY = %ds\n",(int) pgm_to_secs (peer_expiry)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_SPMR_EXPIRY, &spmr_expiry, sizeof(spmr_expiry))) + printf ("FAILED: set SPMR_EXPIRY = %dms\n", (int)pgm_to_msecs (spmr_expiry)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_BO_IVL, &nak_bo_ivl, sizeof(nak_bo_ivl))) + printf ("FAILED: set NAK_BO_IVL = %dms\n", (int)pgm_to_msecs (nak_bo_ivl)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_RPT_IVL, &nak_rpt_ivl, sizeof(nak_rpt_ivl))) + printf ("FAILED: set NAK_RPT_IVL = %dms\n", (int)pgm_to_msecs (nak_rpt_ivl)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_RDATA_IVL, &nak_rdata_ivl, sizeof(nak_rdata_ivl))) + printf ("FAILED: set NAK_RDATA_IVL = %dms\n", (int)pgm_to_msecs (nak_rdata_ivl)); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_DATA_RETRIES, &nak_data_retries, sizeof(nak_data_retries))) + printf ("FAILED: set NAK_DATA_RETRIES = %d\n", nak_data_retries); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NAK_NCF_RETRIES, &nak_ncf_retries, sizeof(nak_ncf_retries))) + printf ("FAILED: set NAK_NCF_RETRIES = %d\n", nak_ncf_retries); + +/* create global session identifier */ + struct pgm_sockaddr_t addr; + memset (&addr, 0, sizeof(addr)); + addr.sa_port = g_port; + addr.sa_addr.sport = 0; + if (!pgm_gsi_create_from_hostname (&addr.sa_addr.gsi, &pgm_err)) { + printf ("FAILED: pgm_gsi_create_from_hostname(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + } + +{ + char buffer[1024]; + pgm_tsi_print_r (&addr.sa_addr, buffer, sizeof(buffer)); + printf ("pgm_bind (sock:%p addr:{port:%d tsi:%s} err:%p)\n", + (gpointer)sess->sock, + addr.sa_port, buffer, + (gpointer)&pgm_err); +} + const bool status = sess->is_transport_fake ? + fake_pgm_bind (sess->sock, &addr, sizeof(addr), &pgm_err) : + pgm_bind (sess->sock, &addr, sizeof(addr), &pgm_err); if (!status) { - printf ("FAILED: pgm_transport_bind(): %s\n", err->message); - pgm_error_free (err); + printf ("FAILED: pgm_bind(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + pgm_error_free (pgm_err); + } else + puts ("READY"); +} + +static +void +session_connect ( + char* session_name + ) +{ + struct pgm_addrinfo_t hints = { + .ai_family = AF_INET + }, *res = NULL; + pgm_error_t* pgm_err = NULL; + +/* check that session exists */ + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); + if (sess == NULL) { + printf ("FAILED: session '%s' not found\n", session_name); + return; + } + + if (!pgm_getaddrinfo (g_network, &hints, &res, &pgm_err)) { + printf ("FAILED: pgm_getaddrinfo(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); + pgm_error_free (pgm_err); + return; + } + +/* join IP multicast groups */ + for (unsigned i = 0; i < res->ai_recv_addrs_len; i++) + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_JOIN_GROUP, &res->ai_recv_addrs[i], sizeof(struct group_req))) + { + char group[INET6_ADDRSTRLEN]; + getnameinfo ((struct sockaddr*)&res->ai_recv_addrs[i].gsr_group, sizeof(struct sockaddr_in), + group, sizeof(group), + NULL, 0, + NI_NUMERICHOST); + printf ("FAILED: join group (#%u %s)\n", (unsigned)res->ai_recv_addrs[i].gsr_interface, group); + } + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_SEND_GROUP, &res->ai_send_addrs[0], sizeof(struct group_req))) + { + char group[INET6_ADDRSTRLEN]; + getnameinfo ((struct sockaddr*)&res->ai_send_addrs[0].gsr_group, sizeof(struct sockaddr_in), + group, sizeof(group), + NULL, 0, + NI_NUMERICHOST); + printf ("FAILED: send group (#%u %s)\n", (unsigned)res->ai_send_addrs[0].gsr_interface, group); + } + pgm_freeaddrinfo (res); + +/* set IP parameters */ + const int non_blocking = 1, + no_multicast_loop = 0, + multicast_hops = 16, + dscp = 0x2e << 2; /* Expedited Forwarding PHB for network elements, no ECN. */ + + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_MULTICAST_LOOP, &no_multicast_loop, sizeof(no_multicast_loop))) + puts ("FAILED: disable multicast loop"); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_MULTICAST_HOPS, &multicast_hops, sizeof(multicast_hops))) + printf ("FAILED: set TTL = %d\n", multicast_hops); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_TOS, &dscp, sizeof(dscp))) + printf ("FAILED: set TOS = 0x%x\n", dscp); + if (!pgm_setsockopt (sess->sock, IPPROTO_PGM, PGM_NOBLOCK, &non_blocking, sizeof(non_blocking))) + puts ("FAILED: set non-blocking sockets"); + + const bool status = sess->is_transport_fake ? + fake_pgm_connect (sess->sock, &pgm_err) : + pgm_connect (sess->sock, &pgm_err); + if (!status) { + printf ("FAILED: pgm_connect(): %s\n", (pgm_err && pgm_err->message) ? pgm_err->message : "(null)"); return; } if (sess->is_transport_fake) { /* add receive socket(s) to event manager */ - sess->recv_channel = g_io_channel_unix_new (sess->transport->recv_sock); + sess->recv_channel = g_io_channel_unix_new (sess->sock->recv_sock); GSource *source; source = g_io_create_watch (sess->recv_channel, G_IO_IN); - g_source_set_callback (source, (GSourceFunc)on_io_data, sess->transport, NULL); + g_source_set_callback (source, (GSourceFunc)on_io_data, sess->sock, NULL); g_source_attach (source, NULL); g_source_unref (source); } else { - pgm_async_create (&sess->async, sess->transport, 0); + pgm_async_create (&sess->async, sess->sock, 0); pgm_async_add_watch (sess->async, on_data, sess); } @@ -741,40 +1092,43 @@ session_bind ( static inline gssize -pgm_sendto ( - pgm_transport_t* transport, - gboolean rl, +pgm_sendto_hops ( + pgm_sock_t* sock, + G_GNUC_UNUSED gboolean rl, gboolean ra, + const int hops, const void* buf, gsize len, const struct sockaddr* to, socklen_t tolen ) { - int sock = ra ? transport->send_with_router_alert_sock : transport->send_sock; - pgm_mutex_lock (&transport->send_mutex); - ssize_t sent = sendto (sock, buf, len, 0, to, tolen); - pgm_mutex_unlock (&transport->send_mutex); + const int send_sock = ra ? sock->send_with_router_alert_sock : sock->send_sock; + pgm_mutex_lock (&sock->send_mutex); + const ssize_t sent = sendto (send_sock, buf, len, 0, to, tolen); + pgm_mutex_unlock (&sock->send_mutex); return sent > 0 ? (gssize)len : (gssize)sent; } static int -pgm_reset_heartbeat_spm (pgm_transport_t* transport) +pgm_reset_heartbeat_spm ( + pgm_sock_t* sock + ) { int retval = 0; - pgm_mutex_lock (&transport->timer_mutex); + pgm_mutex_lock (&sock->timer_mutex); /* re-set spm timer */ - transport->spm_heartbeat_state = 1; - transport->next_heartbeat_spm = pgm_time_update_now() + transport->spm_heartbeat_interval[transport->spm_heartbeat_state++]; + sock->spm_heartbeat_state = 1; + sock->next_heartbeat_spm = pgm_time_update_now() + sock->spm_heartbeat_interval[sock->spm_heartbeat_state++]; /* prod timer thread if sleeping */ - if (pgm_time_after( transport->next_poll, transport->next_heartbeat_spm )) - transport->next_poll = transport->next_heartbeat_spm; + if (pgm_time_after( sock->next_poll, sock->next_heartbeat_spm )) + sock->next_poll = sock->next_heartbeat_spm; - pgm_mutex_unlock (&transport->timer_mutex); + pgm_mutex_unlock (&sock->timer_mutex); return retval; } @@ -782,42 +1136,42 @@ pgm_reset_heartbeat_spm (pgm_transport_t* transport) static inline int brokn_send_apdu_unlocked ( - pgm_transport_t* transport, - const gchar* buf, - gsize count, - gsize* bytes_written + pgm_sock_t* sock, + const gchar* buf, + gsize count, + gsize* bytes_written ) { - guint32 opt_sqn = pgm_txw_next_lead(transport->window); + guint32 opt_sqn = pgm_txw_next_lead(sock->window); guint packets = 0; guint bytes_sent = 0; guint data_bytes_sent = 0; - pgm_mutex_lock (&transport->source_mutex); + pgm_mutex_lock (&sock->source_mutex); do { /* retrieve packet storage from transmit window */ int header_length = sizeof(struct pgm_header) + sizeof(struct pgm_data) + sizeof(struct pgm_opt_length) + /* includes header */ sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_fragment); - int tsdu_length = MIN(transport->max_tpdu - transport->iphdr_len - header_length, count - data_bytes_sent); + int tsdu_length = MIN(sock->max_tpdu - sock->iphdr_len - header_length, count - data_bytes_sent); int tpdu_length = header_length + tsdu_length; struct pgm_sk_buff_t* skb = pgm_alloc_skb (tsdu_length); pgm_skb_put (skb, tpdu_length); skb->pgm_header = (struct pgm_header*)skb->data; - memcpy (skb->pgm_header->pgm_gsi, &transport->tsi.gsi, sizeof(pgm_gsi_t)); - skb->pgm_header->pgm_sport = transport->tsi.sport; - skb->pgm_header->pgm_dport = transport->dport; + memcpy (skb->pgm_header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + skb->pgm_header->pgm_sport = sock->tsi.sport; + skb->pgm_header->pgm_dport = sock->dport; skb->pgm_header->pgm_type = PGM_ODATA; skb->pgm_header->pgm_options = PGM_OPT_PRESENT; skb->pgm_header->pgm_tsdu_length = g_htons (tsdu_length); /* ODATA */ skb->pgm_data = (struct pgm_data*)(skb->pgm_header + 1); - skb->pgm_data->data_sqn = g_htonl (pgm_txw_next_lead(transport->window)); - skb->pgm_data->data_trail = g_htonl (pgm_txw_trail(transport->window)); + skb->pgm_data->data_sqn = g_htonl (pgm_txw_next_lead(sock->window)); + skb->pgm_data->data_trail = g_htonl (pgm_txw_trail(sock->window)); /* OPT_LENGTH */ struct pgm_opt_length* opt_len = (struct pgm_opt_length*)(skb->pgm_data + 1); @@ -846,25 +1200,26 @@ brokn_send_apdu_unlocked ( skb->pgm_header->pgm_checksum = pgm_csum_fold (pgm_csum_block_add (unfolded_header, unfolded_odata, pgm_header_len)); /* add to transmit window */ - pgm_spinlock_lock (&transport->txw_spinlock); - pgm_txw_add (transport->window, skb); - pgm_spinlock_unlock (&transport->txw_spinlock); + pgm_spinlock_lock (&sock->txw_spinlock); + pgm_txw_add (sock->window, skb); + pgm_spinlock_unlock (&sock->txw_spinlock); /* do not send send packet */ if (packets != 1) - pgm_sendto (transport, + pgm_sendto_hops (sock, TRUE, FALSE, + sock->hops, skb->data, tpdu_length, - (struct sockaddr*)&transport->send_gsr.gsr_group, - pgm_sockaddr_len((struct sockaddr*)&transport->send_gsr.gsr_group)); + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); /* save unfolded odata for retransmissions */ *(guint32*)&skb->cb = unfolded_odata; packets++; - bytes_sent += tpdu_length + transport->iphdr_len; + bytes_sent += tpdu_length + sock->iphdr_len; data_bytes_sent += tsdu_length; } while (data_bytes_sent < count); @@ -873,42 +1228,42 @@ brokn_send_apdu_unlocked ( *bytes_written = data_bytes_sent; /* release txw lock here in order to allow spms to lock mutex */ - pgm_mutex_unlock (&transport->source_mutex); - pgm_reset_heartbeat_spm (transport); + pgm_mutex_unlock (&sock->source_mutex); + pgm_reset_heartbeat_spm (sock); return PGM_IO_STATUS_NORMAL; } static int brokn_send ( - pgm_transport_t* transport, - const gchar* data, - gsize len, - gsize* bytes_written + pgm_sock_t* sock, + const gchar* data, + gsize len, + gsize* bytes_written ) { - if ( len <= ( transport->max_tpdu - ( sizeof(struct pgm_header) + - sizeof(struct pgm_data) ) ) ) + if ( len <= ( sock->max_tpdu - ( sizeof(struct pgm_header) + + sizeof(struct pgm_data) ) ) ) { puts ("FAILED: cannot send brokn single TPDU length APDU"); return PGM_IO_STATUS_ERROR; } - return brokn_send_apdu_unlocked (transport, data, len, bytes_written); + return brokn_send_apdu_unlocked (sock, data, len, bytes_written); } static void session_send ( - char* name, + char* session_name, char* string, gboolean is_brokn /* send broken apdu */ ) { /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } @@ -921,24 +1276,30 @@ session_send ( int timeout; again: if (is_brokn) - status = brokn_send (sess->transport, string, stringlen, NULL); + status = brokn_send (sess->sock, string, stringlen, NULL); else - status = pgm_send (sess->transport, string, stringlen, NULL); + status = pgm_send (sess->sock, string, stringlen, NULL); switch (status) { case PGM_IO_STATUS_NORMAL: puts ("READY"); break; case PGM_IO_STATUS_TIMER_PENDING: - pgm_transport_get_timer_pending (sess->transport, &tv); - goto block; + { + socklen_t optlen = sizeof (tv); + pgm_getsockopt (sess->sock, IPPROTO_PGM, PGM_TIME_REMAIN, &tv, &optlen); + } + goto block; case PGM_IO_STATUS_RATE_LIMITED: - pgm_transport_get_rate_remaining (sess->transport, &tv); + { + socklen_t optlen = sizeof (tv); + pgm_getsockopt (sess->sock, IPPROTO_PGM, PGM_RATE_REMAIN, &tv, &optlen); + } /* fall through */ case PGM_IO_STATUS_WOULD_BLOCK: block: timeout = PGM_IO_STATUS_WOULD_BLOCK == status ? -1 : ((tv.tv_sec * 1000) + (tv.tv_usec / 1000)); memset (fds, 0, sizeof(fds)); - pgm_transport_poll_info (sess->transport, fds, &n_fds, POLLOUT); + pgm_poll_info (sess->sock, fds, &n_fds, POLLOUT); poll (fds, n_fds, timeout /* ms */); goto again; default: @@ -950,18 +1311,18 @@ block: static void session_destroy ( - char* name + char* session_name ) { /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } /* remove from hash table */ - g_hash_table_remove (g_sessions, name); + g_hash_table_remove (g_sessions, session_name); /* close down receive side first to stop new data incoming */ if (sess->recv_channel) { @@ -981,13 +1342,13 @@ session_destroy ( if (sess->is_transport_fake) { - fake_pgm_transport_destroy (sess->transport, TRUE); + fake_pgm_close (sess->sock, TRUE); } else { - pgm_transport_destroy (sess->transport, TRUE); + pgm_close (sess->sock, TRUE); } - sess->transport = NULL; + sess->sock = NULL; g_free (sess->name); sess->name = NULL; g_free (sess); @@ -998,7 +1359,7 @@ session_destroy ( static void net_send_data ( - char* name, + char* session_name, guint8 pgm_type, /* PGM_ODATA or PGM_RDATA */ guint32 data_sqn, guint32 txw_trail, @@ -1006,13 +1367,13 @@ net_send_data ( ) { /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - pgm_transport_t* transport = sess->transport; + pgm_sock_t* sock = sess->sock; /* payload is string including terminating null. */ int count = strlen(string) + 1; @@ -1025,9 +1386,9 @@ net_send_data ( struct pgm_header *header = (struct pgm_header*)buf; struct pgm_data *data = (struct pgm_data*)(header + 1); - memcpy (header->pgm_gsi, &transport->tsi.gsi, sizeof(pgm_gsi_t)); - header->pgm_sport = transport->tsi.sport; - header->pgm_dport = transport->dport; + memcpy (header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + header->pgm_sport = sock->tsi.sport; + header->pgm_dport = sock->dport; header->pgm_type = pgm_type; header->pgm_options = 0; header->pgm_tsdu_length = g_htons (count); @@ -1041,14 +1402,14 @@ net_send_data ( header->pgm_checksum = 0; header->pgm_checksum = pgm_csum_fold (pgm_csum_partial ((char*)header, tpdu_length, 0)); - pgm_mutex_lock (&transport->send_mutex); - retval = sendto (transport->send_sock, + pgm_mutex_lock (&sock->send_mutex); + retval = sendto (sock->send_sock, header, tpdu_length, 0, /* not expecting a reply */ - (struct sockaddr*)&transport->send_gsr.gsr_group, - pgm_sockaddr_len((struct sockaddr*)&transport->send_gsr.gsr_group)); - pgm_mutex_unlock (&transport->send_mutex); + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + pgm_mutex_unlock (&sock->send_mutex); puts ("READY"); } @@ -1062,7 +1423,7 @@ net_send_data ( static void net_send_parity ( - char* name, + char* session_name, guint8 pgm_type, /* PGM_ODATA or PGM_RDATA */ guint32 data_sqn, guint32 txw_trail, @@ -1070,18 +1431,18 @@ net_send_parity ( ) { /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - pgm_transport_t* transport = sess->transport; + pgm_sock_t* sock = sess->sock; /* split string into individual payloads */ guint16 parity_length = 0; gchar** src; - src = g_strsplit (string, " ", transport->rs_k); + src = g_strsplit (string, " ", sock->rs_k); /* payload is string including terminating null. */ parity_length = strlen(*src) + 1; @@ -1100,8 +1461,8 @@ net_send_parity ( } } - if ( i != transport->rs_k ) { - printf ("FAILED: payload array length %u, whilst rs_k is %u.\n", i, transport->rs_k); + if ( i != sock->rs_k ) { + printf ("FAILED: payload array length %u, whilst rs_k is %u.\n", i, sock->rs_k); return; } @@ -1121,7 +1482,7 @@ net_send_parity ( } /* calculate FEC block offset */ - guint32 tg_sqn_mask = 0xffffffff << transport->tg_sqn_shift; + guint32 tg_sqn_mask = 0xffffffff << sock->tg_sqn_shift; guint rs_h = data_sqn & ~tg_sqn_mask; /* send */ @@ -1132,9 +1493,9 @@ net_send_parity ( struct pgm_header *header = (struct pgm_header*)buf; struct pgm_data *data = (struct pgm_data*)(header + 1); - memcpy (header->pgm_gsi, &transport->tsi.gsi, sizeof(pgm_gsi_t)); - header->pgm_sport = transport->tsi.sport; - header->pgm_dport = transport->dport; + memcpy (header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + header->pgm_sport = sock->tsi.sport; + header->pgm_dport = sock->dport; header->pgm_type = pgm_type; header->pgm_options = is_var_pktlen ? (PGM_OPT_PARITY | PGM_OPT_VAR_PKTLEN) : PGM_OPT_PARITY; header->pgm_tsdu_length = g_htons (parity_length); @@ -1145,21 +1506,21 @@ net_send_parity ( memset (data + 1, 0, parity_length); pgm_rs_t rs; - pgm_rs_create (&rs, transport->rs_n, transport->rs_k); - pgm_rs_encode (&rs, (const pgm_gf8_t**)src, transport->rs_k + rs_h, (pgm_gf8_t*)(data + 1), parity_length); + pgm_rs_create (&rs, sock->rs_n, sock->rs_k); + pgm_rs_encode (&rs, (const pgm_gf8_t**)src, sock->rs_k + rs_h, (pgm_gf8_t*)(data + 1), parity_length); pgm_rs_destroy (&rs); header->pgm_checksum = 0; header->pgm_checksum = pgm_csum_fold (pgm_csum_partial ((char*)header, tpdu_length, 0)); - pgm_mutex_lock (&transport->send_mutex); - retval = sendto (transport->send_sock, + pgm_mutex_lock (&sock->send_mutex); + retval = sendto (sock->send_sock, header, tpdu_length, 0, /* not expecting a reply */ - (struct sockaddr*)&transport->send_gsr.gsr_group, - pgm_sockaddr_len((struct sockaddr*)&transport->send_gsr.gsr_group)); - pgm_mutex_unlock (&transport->send_mutex); + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); + pgm_mutex_unlock (&sock->send_mutex); g_strfreev (src); src = NULL; @@ -1170,7 +1531,7 @@ net_send_parity ( static void net_send_spm ( - char* name, + char* session_name, guint32 spm_sqn, guint32 txw_trail, guint32 txw_lead, @@ -1180,13 +1541,13 @@ net_send_spm ( ) { /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - pgm_transport_t* transport = sess->transport; + pgm_sock_t* sock = sess->sock; /* send */ int retval = 0; @@ -1202,9 +1563,9 @@ net_send_spm ( struct pgm_header *header = (struct pgm_header*)buf; struct pgm_spm *spm = (struct pgm_spm*)(header + 1); - memcpy (header->pgm_gsi, &transport->tsi.gsi, sizeof(pgm_gsi_t)); - header->pgm_sport = transport->tsi.sport; - header->pgm_dport = transport->dport; + memcpy (header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); + header->pgm_sport = sock->tsi.sport; + header->pgm_dport = sock->dport; header->pgm_type = PGM_SPM; header->pgm_options = (proactive_parity || ondemand_parity) ? (PGM_OPT_PRESENT | PGM_OPT_NETWORK) : 0; header->pgm_tsdu_length = 0; @@ -1213,7 +1574,7 @@ net_send_spm ( spm->spm_sqn = g_htonl (spm_sqn); spm->spm_trail = g_htonl (txw_trail); spm->spm_lead = g_htonl (txw_lead); - pgm_sockaddr_to_nla ((struct sockaddr*)&transport->send_addr, (char*)&spm->spm_nla_afi); + pgm_sockaddr_to_nla ((struct sockaddr*)&sock->send_addr, (char*)&spm->spm_nla_afi); if (proactive_parity || ondemand_parity) { struct pgm_opt_length* opt_len = (struct pgm_opt_length*)(spm + 1); @@ -1234,43 +1595,43 @@ net_send_spm ( header->pgm_checksum = 0; header->pgm_checksum = pgm_csum_fold (pgm_csum_partial ((char*)header, tpdu_length, 0)); - retval = sendto (transport->send_sock, + retval = sendto (sock->send_sock, header, tpdu_length, 0, /* not expecting a reply */ - (struct sockaddr*)&transport->send_gsr.gsr_group, - pgm_sockaddr_len((struct sockaddr*)&transport->send_gsr.gsr_group)); + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); puts ("READY"); } static void net_send_spmr ( - char* name, + char* session_name, pgm_tsi_t* tsi ) { /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } - pgm_transport_t* transport = sess->transport; + pgm_sock_t* sock = sess->sock; /* check that the peer exists */ - pgm_peer_t* peer = pgm_hashtable_lookup (transport->peers_hashtable, tsi); + pgm_peer_t* peer = pgm_hashtable_lookup (sock->peers_hashtable, tsi); struct sockaddr_storage peer_nla; pgm_gsi_t* peer_gsi; guint16 peer_sport; if (peer == NULL) { /* ourself */ - if (pgm_tsi_equal (tsi, &transport->tsi)) + if (pgm_tsi_equal (tsi, &sock->tsi)) { - peer_gsi = &transport->tsi.gsi; - peer_sport = transport->tsi.sport; + peer_gsi = &sock->tsi.gsi; + peer_sport = sock->tsi.sport; } else { @@ -1292,7 +1653,7 @@ net_send_spmr ( struct pgm_header *header = (struct pgm_header*)buf; memcpy (header->pgm_gsi, peer_gsi, sizeof(pgm_gsi_t)); - header->pgm_sport = transport->dport; + header->pgm_sport = sock->dport; header->pgm_dport = peer_sport; header->pgm_type = PGM_SPMR; header->pgm_options = 0; @@ -1300,21 +1661,21 @@ net_send_spmr ( header->pgm_checksum = 0; header->pgm_checksum = pgm_csum_fold (pgm_csum_partial ((char*)header, tpdu_length, 0)); - pgm_mutex_lock (&transport->send_mutex); + pgm_mutex_lock (&sock->send_mutex); /* TTL 1 */ - pgm_sockaddr_multicast_hops (transport->send_sock, transport->send_gsr.gsr_group.ss_family, 1); - retval = sendto (transport->send_sock, + pgm_sockaddr_multicast_hops (sock->send_sock, sock->send_gsr.gsr_group.ss_family, 1); + retval = sendto (sock->send_sock, header, tpdu_length, 0, /* not expecting a reply */ - (struct sockaddr*)&transport->send_gsr.gsr_group, - pgm_sockaddr_len((struct sockaddr*)&transport->send_gsr.gsr_group)); + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); /* default TTL */ - pgm_sockaddr_multicast_hops (transport->send_sock, transport->send_gsr.gsr_group.ss_family, transport->hops); + pgm_sockaddr_multicast_hops (sock->send_sock, sock->send_gsr.gsr_group.ss_family, sock->hops); - if (!pgm_tsi_equal (tsi, &transport->tsi)) + if (!pgm_tsi_equal (tsi, &sock->tsi)) { - retval = sendto (transport->send_sock, + retval = sendto (sock->send_sock, header, tpdu_length, 0, /* not expecting a reply */ @@ -1322,7 +1683,7 @@ net_send_spmr ( pgm_sockaddr_len((struct sockaddr*)&peer_nla)); } - pgm_mutex_unlock (&transport->send_mutex); + pgm_mutex_unlock (&sock->send_mutex); puts ("READY"); } @@ -1334,21 +1695,21 @@ net_send_spmr ( static void net_send_ncf ( - char* name, + char* session_name, pgm_tsi_t* tsi, struct pgm_sqn_list_t* sqn_list /* list of sequence numbers */ ) { /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } /* check that the peer exists */ - pgm_transport_t* transport = sess->transport; - pgm_peer_t* peer = pgm_hashtable_lookup (transport->peers_hashtable, tsi); + pgm_sock_t* sock = sess->sock; + pgm_peer_t* peer = pgm_hashtable_lookup (sock->peers_hashtable, tsi); if (peer == NULL) { printf ("FAILED: peer \"%s\" not found\n", pgm_tsi_print (tsi)); return; @@ -1374,14 +1735,14 @@ net_send_ncf ( struct pgm_header *header = (struct pgm_header*)buf; struct pgm_nak *ncf = (struct pgm_nak*)(header + 1); - memcpy (header->pgm_gsi, &transport->tsi.gsi, sizeof(pgm_gsi_t)); + memcpy (header->pgm_gsi, &sock->tsi.gsi, sizeof(pgm_gsi_t)); struct sockaddr_storage peer_nla; memcpy (&peer_nla, &peer->nla, sizeof(struct sockaddr_storage)); /* dport & sport swap over for a nak */ - header->pgm_sport = transport->tsi.sport; - header->pgm_dport = transport->dport; + header->pgm_sport = sock->tsi.sport; + header->pgm_dport = sock->dport; header->pgm_type = PGM_NCF; header->pgm_options = (sqn_list->len > 1) ? (PGM_OPT_PRESENT | PGM_OPT_NETWORK) : 0; header->pgm_tsdu_length = 0; @@ -1393,7 +1754,7 @@ net_send_ncf ( pgm_sockaddr_to_nla ((struct sockaddr*)&peer_nla, (char*)&ncf->nak_src_nla_afi); /* group nla */ - pgm_sockaddr_to_nla ((struct sockaddr*)&transport->recv_gsr[0].gsr_group, (char*)&ncf->nak_grp_nla_afi); + pgm_sockaddr_to_nla ((struct sockaddr*)&sock->recv_gsr[0].gsr_group, (char*)&ncf->nak_grp_nla_afi); /* OPT_NAK_LIST */ if (sqn_list->len > 1) @@ -1419,12 +1780,12 @@ net_send_ncf ( header->pgm_checksum = 0; header->pgm_checksum = pgm_csum_fold (pgm_csum_partial ((char*)header, tpdu_length, 0)); - retval = sendto (transport->send_with_router_alert_sock, + retval = sendto (sock->send_with_router_alert_sock, header, tpdu_length, 0, /* not expecting a reply */ - (struct sockaddr*)&transport->send_gsr.gsr_group, - pgm_sockaddr_len((struct sockaddr*)&transport->send_gsr.gsr_group)); + (struct sockaddr*)&sock->send_gsr.gsr_group, + pgm_sockaddr_len((struct sockaddr*)&sock->send_gsr.gsr_group)); puts ("READY"); } @@ -1432,22 +1793,22 @@ net_send_ncf ( static void net_send_nak ( - char* name, + char* session_name, pgm_tsi_t* tsi, struct pgm_sqn_list_t* sqn_list, /* list of sequence numbers */ gboolean is_parity /* TRUE = parity, FALSE = selective */ ) { /* check that session exists */ - struct sim_session* sess = g_hash_table_lookup (g_sessions, name); + struct sim_session* sess = g_hash_table_lookup (g_sessions, session_name); if (sess == NULL) { - puts ("FAILED: session not found"); + printf ("FAILED: session '%s' not found\n", session_name); return; } /* check that the peer exists */ - pgm_transport_t* transport = sess->transport; - pgm_peer_t* peer = pgm_hashtable_lookup (transport->peers_hashtable, tsi); + pgm_sock_t* sock = sess->sock; + pgm_peer_t* peer = pgm_hashtable_lookup (sock->peers_hashtable, tsi); if (peer == NULL) { printf ("FAILED: peer \"%s\" not found\n", pgm_tsi_print(tsi)); return; @@ -1474,7 +1835,7 @@ net_send_nak ( memcpy (&peer_nla, &peer->nla, sizeof(struct sockaddr_storage)); /* dport & sport swap over for a nak */ - header->pgm_sport = transport->dport; + header->pgm_sport = sock->dport; header->pgm_dport = peer_sport; header->pgm_type = PGM_NAK; if (is_parity) { @@ -1492,7 +1853,7 @@ net_send_nak ( pgm_sockaddr_to_nla ((struct sockaddr*)&peer_nla, (char*)&nak->nak_src_nla_afi); /* group nla */ - pgm_sockaddr_to_nla ((struct sockaddr*)&transport->recv_gsr[0].gsr_group, (char*)&nak->nak_grp_nla_afi); + pgm_sockaddr_to_nla ((struct sockaddr*)&sock->recv_gsr[0].gsr_group, (char*)&nak->nak_grp_nla_afi); /* OPT_NAK_LIST */ if (sqn_list->len > 1) @@ -1518,7 +1879,7 @@ net_send_nak ( header->pgm_checksum = 0; header->pgm_checksum = pgm_csum_fold (pgm_csum_partial ((char*)header, tpdu_length, 0)); - retval = sendto (transport->send_with_router_alert_sock, + retval = sendto (sock->send_with_router_alert_sock, header, tpdu_length, 0, /* not expecting a reply */ @@ -1548,9 +1909,9 @@ on_data ( static gboolean on_stdin_data ( - GIOChannel* source, - G_GNUC_UNUSED GIOCondition condition, - G_GNUC_UNUSED gpointer data + GIOChannel* source, + G_GNUC_UNUSED GIOCondition condition, + G_GNUC_UNUSED gpointer data ) { gchar* str = NULL; @@ -1627,7 +1988,7 @@ on_stdin_data ( p = str + pmatch[4].rm_so; guint txw_trail = strtoul (p, &p, 10); -/* ideally confirm number of payloads matches sess->transport::rs_k ... */ +/* ideally confirm number of payloads matches sess->sock::rs_k ... */ char *string = g_memdup (str + pmatch[5].rm_so, pmatch[5].rm_eo - pmatch[5].rm_so + 1 ); string[ pmatch[5].rm_eo - pmatch[5].rm_so ] = 0; @@ -1806,7 +2167,7 @@ on_stdin_data ( } regfree (&preg); -/* bind transport */ +/* bind socket */ re = "^bind[[:space:]]+([[:alnum:]]+)$"; regcomp (&preg, re, REG_EXTENDED); if (0 == regexec (&preg, str, G_N_ELEMENTS(pmatch), pmatch, 0)) @@ -1822,6 +2183,22 @@ on_stdin_data ( } regfree (&preg); +/* connect socket */ + re = "^connect[[:space:]]+([[:alnum:]]+)$"; + regcomp (&preg, re, REG_EXTENDED); + if (0 == regexec (&preg, str, G_N_ELEMENTS(pmatch), pmatch, 0)) + { + char *name = g_memdup (str + pmatch[1].rm_so, pmatch[1].rm_eo - pmatch[1].rm_so + 1 ); + name[ pmatch[1].rm_eo - pmatch[1].rm_so ] = 0; + + session_connect (name); + + g_free (name); + regfree (&preg); + goto out; + } + regfree (&preg); + /* send packet */ re = "^send[[:space:]]+([[:alnum:]]+)[[:space:]]+([[:alnum:]]+)$"; regcomp (&preg, re, REG_EXTENDED); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/spm.pl b/3rdparty/openpgm-svn-r1135/pgm/test/spm.pl index c92b8fc..5da52ac 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/spm.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/spm.pl @@ -27,6 +27,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); print "app: ready.\n"; print "mon: wait for spm ...\n"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/spm_jump.pl b/3rdparty/openpgm-svn-r1135/pgm/test/spm_jump.pl index 9b89720..4660a83 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/spm_jump.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/spm_jump.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/spm_jump2.pl b/3rdparty/openpgm-svn-r1135/pgm/test/spm_jump2.pl index 4ad0562..20d279e 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/spm_jump2.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/spm_jump2.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,001 txw_lead 90,000 at spm_sqn 3200.\n"; $sim->say ("net send spm ao 3200 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/spm_reception.pl b/3rdparty/openpgm-svn-r1135/pgm/test/spm_reception.pl index 63ea43f..5718305 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/spm_reception.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/spm_reception.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish SPM txw_trail 90,000.\n"; $sim->say ("net send spm ao 1 90001 90000"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/spmr.pl b/3rdparty/openpgm-svn-r1135/pgm/test/spmr.pl index a22f14d..690e2a5 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/spmr.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/spmr.pl @@ -30,10 +30,12 @@ print "mon: ready.\n"; $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); ## capture GSI of test spp diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/spmr_after_spm.pl b/3rdparty/openpgm-svn-r1135/pgm/test/spmr_after_spm.pl index a1ca5ee..c8eb045 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/spmr_after_spm.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/spmr_after_spm.pl @@ -30,6 +30,7 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); ## capture GSI of test spp @@ -50,6 +51,7 @@ do { $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: ready.\n"; ## app needs to send packet for sim to learn of local NLA diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/spmr_from_odata.pl b/3rdparty/openpgm-svn-r1135/pgm/test/spmr_from_odata.pl index 0563b3f..519518b 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/spmr_from_odata.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/spmr_from_odata.pl @@ -29,10 +29,12 @@ print "mon: ready.\n"; $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish ODATA sqn 90,001.\n"; $sim->say ("net send odata ao 90001 90001 ringo"); diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/spmr_suppression.pl b/3rdparty/openpgm-svn-r1135/pgm/test/spmr_suppression.pl index a1df615..5b73c26 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/test/spmr_suppression.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/spmr_suppression.pl @@ -26,6 +26,7 @@ $SIG{'INT'} = sub { print "interrupt caught.\n"; close_ssh(); }; $sim->say ("create fake ao"); $sim->say ("bind ao"); +$sim->say ("connect ao"); print "sim: publish ODATA sqn 90,001 to monitor for GSI.\n"; $sim->say ("net send odata ao 90001 90001 ringo"); @@ -35,6 +36,7 @@ $mon->say ("filter $config{app}{ip}"); $app->say ("create ao"); $app->say ("bind ao"); +$app->say ("connect ao"); $app->say ("listen ao"); print "sim: re-publish ODATA sqn 90,001 to app.\n"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/sudoers.example b/3rdparty/openpgm-svn-r1135/pgm/test/sudoers.example index 9212139..9212139 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/sudoers.example +++ b/3rdparty/openpgm-svn-r1135/pgm/test/sudoers.example diff --git a/3rdparty/openpgm-svn-r1085/pgm/test/test.conf.pl b/3rdparty/openpgm-svn-r1135/pgm/test/test.conf.pl index 428f49e..66860c6 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/test/test.conf.pl +++ b/3rdparty/openpgm-svn-r1135/pgm/test/test.conf.pl @@ -7,12 +7,12 @@ use vars qw ( %config ); ip => '10.6.28.34', }, app => { -# host => 'ayaka', ip => '10.6.28.31', -# cmd => '/miru/projects/openpgm/pgm/ref/release-Linux-x86_64/test/app', -# network => 'eth0;239.192.0.1' - host => 'ryoko', ip => '10.6.28.36', - cmd => 'LD_LIBRARY_PATH=/opt/glib-sunstudio/lib:$LD_LIBRARY_PATH /miru/projects/openpgm/pgm/ref/release-SunOS-sun4u-sunstudio/test/app', - network => 'eri0;239.192.0.1' + host => 'ayaka', ip => '10.6.28.31', + cmd => '/miru/projects/openpgm/pgm/ref/release-Linux-x86_64/test/app', + network => 'eth0;239.192.0.1' +# host => 'ryoko', ip => '10.6.28.36', +# cmd => 'LD_LIBRARY_PATH=/opt/glib-sunstudio/lib:$LD_LIBRARY_PATH /miru/projects/openpgm/pgm/ref/release-SunOS-sun4u-sunstudio/test/app', +# network => 'eri0;239.192.0.1' }, mon => { host => 'sora', diff --git a/3rdparty/openpgm-svn-r1085/pgm/thread.c b/3rdparty/openpgm-svn-r1135/pgm/thread.c index ad68ca3..ad68ca3 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/thread.c +++ b/3rdparty/openpgm-svn-r1135/pgm/thread.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/thread.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/thread.c.c89.patch new file mode 100644 index 0000000..34acaaf --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/thread.c.c89.patch @@ -0,0 +1,137 @@ +--- thread.c 2010-05-21 11:35:21.000000000 +0800 ++++ thread.c89 2010-08-05 11:31:03.000000000 +0800 +@@ -46,7 +46,8 @@ + } while (0) + # define posix_check_cmd(cmd) posix_check_err ((cmd), #cmd) + #else +-# define win32_check_err(err, name) \ ++# ifdef __PRETTY_FUNCTION ++# define win32_check_err(err, name) \ + do { \ + const bool save_error = (err); \ + if (PGM_UNLIKELY(!save_error)) { \ +@@ -55,6 +56,17 @@ + pgm_wsastrerror (GetLastError ()), name); \ + } \ + } while (0) ++# else ++# define win32_check_err(err, name) \ ++ do { \ ++ const bool save_error = (err); \ ++ if (PGM_UNLIKELY(!save_error)) { \ ++ pgm_error ("file %s: line %d: error '%s' during '%s'", \ ++ __FILE__, __LINE__, \ ++ pgm_wsastrerror (GetLastError ()), name); \ ++ } \ ++ } while (0) ++# endif + # define win32_check_cmd(cmd) win32_check_err ((cmd), #cmd) + #endif /* !_WIN32 */ + +@@ -94,9 +106,11 @@ + #ifndef _WIN32 + posix_check_cmd (pthread_mutex_init (&mutex->pthread_mutex, NULL)); + #else ++ { + HANDLE handle; +- win32_check_cmd (handle = CreateMutex (NULL, FALSE, NULL)); ++ win32_check_cmd (NULL != (handle = CreateMutex (NULL, FALSE, NULL))); + mutex->win32_mutex = handle; ++ } + #endif /* !_WIN32 */ + } + +@@ -113,9 +127,11 @@ + posix_check_err (result, "pthread_mutex_trylock"); + return TRUE; + #else ++ { + DWORD result; + win32_check_cmd (WAIT_FAILED != (result = WaitForSingleObject (mutex->win32_mutex, 0))); + return WAIT_TIMEOUT != result; ++ } + #endif /* !_WIN32 */ + } + +@@ -227,8 +243,11 @@ + WakeAllConditionVariable (&cond->win32_cond); + #else + EnterCriticalSection (&cond->win32_spinlock); +- for (unsigned i = 0; i < cond->len; i++) ++ { ++ unsigned i; ++ for (i = 0; i < cond->len; i++) + SetEvent (cond->phandle[ i ]); ++ } + cond->len = 0; + LeaveCriticalSection (&cond->win32_spinlock); + #endif /* !_WIN32 */ +@@ -257,11 +276,12 @@ + # if defined(CONFIG_HAVE_WIN_COND) + SleepConditionVariableCS (&cond->win32_cond, spinlock, INFINITE); + # else ++ { + DWORD status; + HANDLE event = TlsGetValue (cond_event_tls); + + if (!event) { +- win32_check_cmd (event = CreateEvent (0, FALSE, FALSE, NULL)); ++ win32_check_cmd (NULL != (event = CreateEvent (0, FALSE, FALSE, NULL))); + TlsSetValue (cond_event_tls, event); + } + +@@ -280,7 +300,9 @@ + + if (WAIT_TIMEOUT == status) { + EnterCriticalSection (&cond->win32_spinlock); +- for (unsigned i = 0; i < cond->len; i++) { ++ { ++ unsigned i; ++ for (i = 0; i < cond->len; i++) { + if (cond->phandle[ i ] == event) { + if (i != cond->len - 1) + memmove (&cond->phandle[ i ], &cond->phandle[ i + 1 ], sizeof(HANDLE) * (cond->len - i - 1)); +@@ -288,9 +310,11 @@ + break; + } + } ++ } + win32_check_cmd (WAIT_FAILED != (status = WaitForSingleObject (event, 0))); + LeaveCriticalSection (&cond->win32_spinlock); + } ++ } + # endif /* !CONFIG_HAVE_WIN_COND */ + } + #endif /* !_WIN32 */ +@@ -384,6 +408,7 @@ + ) + { + pgm_assert (NULL != rwlock); ++ { + bool status; + EnterCriticalSection (&rwlock->win32_spinlock); + if (!rwlock->have_writer && !rwlock->want_to_write) { +@@ -393,6 +418,7 @@ + status = FALSE; + LeaveCriticalSection (&rwlock->win32_spinlock); + return status; ++ } + } + + void +@@ -429,6 +455,7 @@ + ) + { + pgm_assert (NULL != rwlock); ++ { + bool status; + EnterCriticalSection (&rwlock->win32_spinlock); + if (!rwlock->have_writer && !rwlock->read_counter) { +@@ -438,6 +465,7 @@ + status = FALSE; + LeaveCriticalSection (&rwlock->win32_spinlock); + return status; ++ } + } + + void diff --git a/3rdparty/openpgm-svn-r1085/pgm/time.c b/3rdparty/openpgm-svn-r1135/pgm/time.c index 9b8eeaa..f012b50 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/time.c +++ b/3rdparty/openpgm-svn-r1135/pgm/time.c @@ -20,7 +20,11 @@ */ #define __STDC_FORMAT_MACROS -#include <inttypes.h> +#ifdef _MSC_VER +# include <pgm/wininttypes.h> +#else +# include <inttypes.h> +#endif #include <errno.h> #include <stdlib.h> #ifdef _WIN32 diff --git a/3rdparty/openpgm-svn-r1135/pgm/time.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/time.c.c89.patch new file mode 100644 index 0000000..be65fec --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/time.c.c89.patch @@ -0,0 +1,115 @@ +--- time.c 2010-08-04 18:15:50.000000000 +0800 ++++ time.c89 2010-08-05 12:22:53.000000000 +0800 +@@ -232,7 +232,15 @@ + return TRUE; + + /* current time */ ++#ifdef _MSC_VER ++ { ++ char* cfg = NULL; ++ size_t len; ++ errno_t err = _dupenv_s (&cfg, &len, "PGM_TIMER"); ++#else ++ { + const char *cfg = getenv ("PGM_TIMER"); ++#endif + if (cfg == NULL) { + #ifdef CONFIG_HAVE_TSC + cfg = "TSC"; +@@ -292,6 +300,13 @@ + #endif + } + ++#ifdef _MSC_VER ++/* cleanup after _dupenv_s() */ ++ if (!err && len > 0) { ++ free (cfg); ++ } ++#endif ++ + #ifdef CONFIG_HAVE_RTC + if (pgm_time_update_now == pgm_rtc_update) + { +@@ -324,10 +339,12 @@ + fclose (fp); + } + #elif defined(_WIN32) ++ { + uint64_t frequency; + if (QueryPerformanceFrequency ((LARGE_INTEGER*)&frequency)) + { +- tsc_mhz = frequency / 1000; ++ tsc_mhz = (uint_fast32_t)(frequency / 1000); ++ } + } + #endif /* !_WIN32 */ + +@@ -335,10 +352,20 @@ + * + * Value can be used to override kernel tick rate as well as internal calibration + */ ++ { ++#ifdef _MSC_VER ++ char* env_mhz = NULL; ++ size_t len; ++ errno_t err = _dupenv_s (&env_mhz, &len, "RDTSC_FREQUENCY"); ++#else + const char *env_mhz = getenv ("RDTSC_FREQUENCY"); ++#endif + if (env_mhz) + tsc_mhz = atoi (env_mhz); +- ++#ifdef _MSC_VER ++ free (env_mhz); ++#endif ++ } + #ifndef _WIN32 + /* calibrate */ + if (0 >= tsc_mhz) { +@@ -394,6 +421,7 @@ + err_cleanup: + pgm_atomic_dec32 (&time_ref_count); + return FALSE; ++ } + } + + /* returns TRUE if shutdown succeeded, returns FALSE on error. +@@ -407,6 +435,7 @@ + if (pgm_atomic_exchange_and_add32 (&time_ref_count, (uint32_t)-1) != 1) + return TRUE; + ++ { + bool success = TRUE; + #ifdef CONFIG_HAVE_RTC + if (pgm_time_update_now == pgm_rtc_update) +@@ -417,6 +446,7 @@ + success = pgm_hpet_shutdown (); + #endif + return success; ++ } + } + + #ifdef CONFIG_HAVE_GETTIMEOFDAY +@@ -456,14 +486,21 @@ + pgm_time_t + pgm_ftime_update (void) + { +- struct timeb ftime_now; + static pgm_time_t last = 0; ++#ifdef _MSC_VER ++ struct __timeb64 ftime_now; ++ _ftime64_s (&ftime_now); ++#else ++ struct timeb ftime_now; + ftime (&ftime_now); ++#endif ++ { + const pgm_time_t now = secs_to_usecs (ftime_now.time) + msecs_to_usecs (ftime_now.millitm); + if (PGM_UNLIKELY(now < last)) + return last; + else + return last = now; ++ } + } + #endif /* CONFIG_HAVE_FTIME */ + diff --git a/3rdparty/openpgm-svn-r1085/pgm/time_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/time_unittest.c index fd28572..fd28572 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/time_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/time_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/timer.c b/3rdparty/openpgm-svn-r1135/pgm/timer.c index 3bee14c..0df1f66 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/timer.c +++ b/3rdparty/openpgm-svn-r1135/pgm/timer.c @@ -20,7 +20,11 @@ */ #define __STDC_FORMAT_MACROS -#include <inttypes.h> +#ifdef _MSC_VER +# include <pgm/wininttypes.h> +#else +# include <inttypes.h> +#endif #include <impl/i18n.h> #include <impl/framework.h> #include <impl/timer.h> diff --git a/3rdparty/openpgm-svn-r1135/pgm/timer.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/timer.c.c89.patch new file mode 100644 index 0000000..890f131 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/timer.c.c89.patch @@ -0,0 +1,63 @@ +--- timer.c 2010-08-04 18:16:05.000000000 +0800 ++++ timer.c89 2010-08-05 11:34:01.000000000 +0800 +@@ -52,6 +52,7 @@ + pgm_assert (NULL != sock); + pgm_assert (sock->can_send_data || sock->can_recv_data); + ++ { + pgm_time_t now = pgm_time_update_now(); + pgm_time_t expiration; + +@@ -65,13 +66,14 @@ + /* advance time again to adjust for processing time out of the event loop, this + * could cause further timers to expire even before checking for new wire data. + */ +- msec = pgm_to_msecs ((int64_t)expiration - (int64_t)now); ++ msec = (int32_t)pgm_to_msecs ((int64_t)expiration - (int64_t)now); + if (msec < 0) + msec = 0; + else + msec = MIN (INT32_MAX, msec); + pgm_trace (PGM_LOG_ROLE_NETWORK,_("Next expiration in %" PRIi32 "ms"), msec); + return (msec == 0); ++ } + } + + bool +@@ -148,11 +150,13 @@ + if (pgm_time_after_eq (now, sock->ack_expiry)) + { + #ifdef DEBUG_PGMCC ++{ + char nows[1024]; + time_t t = time (NULL); + struct tm* tmp = localtime (&t); + strftime (nows, sizeof(nows), "%Y-%m-%d %H:%M:%S", tmp); + printf ("ACK timeout, T:%u W:%u\n", pgm_fp8tou(sock->tokens), pgm_fp8tou(sock->cwnd_size)); ++} + #endif + sock->tokens = sock->cwnd_size = pgm_fp8 (1); + sock->ack_bitmap = 0xffffffff; +@@ -166,11 +170,13 @@ + + /* SPM broadcast */ + pgm_mutex_lock (&sock->timer_mutex); ++ { + const unsigned spm_heartbeat_state = sock->spm_heartbeat_state; + const pgm_time_t next_heartbeat_spm = sock->next_heartbeat_spm; + pgm_mutex_unlock (&sock->timer_mutex); + + /* no lock needed on ambient */ ++ { + const pgm_time_t next_ambient_spm = sock->next_ambient_spm; + pgm_time_t next_spm = spm_heartbeat_state ? MIN(next_heartbeat_spm, next_ambient_spm) : next_ambient_spm; + +@@ -217,6 +223,8 @@ + pgm_mutex_lock (&sock->timer_mutex); + sock->next_poll = sock->next_poll > now ? MIN(sock->next_poll, next_expiration) : next_expiration; + pgm_mutex_unlock (&sock->timer_mutex); ++ } ++ } + } + else + sock->next_poll = next_expiration; diff --git a/3rdparty/openpgm-svn-r1085/pgm/timer_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/timer_unittest.c index 2e48802..2e48802 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/timer_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/timer_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/token and leaky bucket.txt b/3rdparty/openpgm-svn-r1135/pgm/token and leaky bucket.txt index 3efb9c7..3efb9c7 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/token and leaky bucket.txt +++ b/3rdparty/openpgm-svn-r1135/pgm/token and leaky bucket.txt diff --git a/3rdparty/openpgm-svn-r1085/pgm/tsi.c b/3rdparty/openpgm-svn-r1135/pgm/tsi.c index 5f9ae85..5f9ae85 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/tsi.c +++ b/3rdparty/openpgm-svn-r1135/pgm/tsi.c diff --git a/3rdparty/openpgm-svn-r1135/pgm/tsi.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/tsi.c.c89.patch new file mode 100644 index 0000000..ff95ba8 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/tsi.c.c89.patch @@ -0,0 +1,33 @@ +--- tsi.c 2010-05-21 11:32:16.000000000 +0800 ++++ tsi.c89 2010-08-05 11:01:48.000000000 +0800 +@@ -46,11 +46,18 @@ + pgm_return_val_if_fail (NULL != buf, -1); + pgm_return_val_if_fail (bufsize > 0, -1); + ++ { + const uint8_t* gsi = (const uint8_t*)tsi; + const uint16_t source_port = tsi->sport; + ++#ifdef _MSC_VER ++ return _snprintf_s (buf, bufsize, _TRUNCATE, "%i.%i.%i.%i.%i.%i.%i", ++ gsi[0], gsi[1], gsi[2], gsi[3], gsi[4], gsi[5], ntohs (source_port)); ++#else + return snprintf (buf, bufsize, "%i.%i.%i.%i.%i.%i.%i", + gsi[0], gsi[1], gsi[2], gsi[3], gsi[4], gsi[5], ntohs (source_port)); ++#endif ++ } + } + + /* transform TSI to ASCII string form. +@@ -65,9 +72,11 @@ + { + pgm_return_val_if_fail (tsi != NULL, NULL); + ++ { + static char buf[PGM_TSISTRLEN]; + pgm_tsi_print_r (tsi, buf, sizeof(buf)); + return buf; ++ } + } + + /* create hash value of TSI for use with GLib hash tables. diff --git a/3rdparty/openpgm-svn-r1085/pgm/tsi_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/tsi_unittest.c index fddff25..fddff25 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/tsi_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/tsi_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/txw.c b/3rdparty/openpgm-svn-r1135/pgm/txw.c index e2487ae..36f4c53 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/txw.c +++ b/3rdparty/openpgm-svn-r1135/pgm/txw.c @@ -20,7 +20,11 @@ */ #define __STDC_FORMAT_MACROS -#include <inttypes.h> +#ifdef _MSC_VER +# include <pgm/wininttypes.h> +#else +# include <inttypes.h> +#endif #include <impl/i18n.h> #include <impl/framework.h> #include <impl/txw.h> diff --git a/3rdparty/openpgm-svn-r1135/pgm/txw.c.c89.patch b/3rdparty/openpgm-svn-r1135/pgm/txw.c.c89.patch new file mode 100644 index 0000000..033d337 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/txw.c.c89.patch @@ -0,0 +1,223 @@ +--- txw.c 2010-08-05 11:07:09.000000000 +0800 ++++ txw.c89 2010-08-05 11:11:36.000000000 +0800 +@@ -192,7 +192,7 @@ + pgm_assert_cmpuint (rs_k, >, 0); + } + +- pgm_debug ("create (tsi:%s max-tpdu:%" PRIu16 " sqns:%" PRIu32 " secs %u max-rte %zd use-fec:%s rs(n):%u rs(k):%u)", ++ pgm_debug ("create (tsi:%s max-tpdu:%" PRIu16 " sqns:%" PRIu32 " secs %u max-rte %ld use-fec:%s rs(n):%u rs(k):%u)", + pgm_tsi_print (tsi), + tpdu_size, sqns, secs, max_rte, + use_fec ? "YES" : "NO", +@@ -200,6 +200,7 @@ + + /* calculate transmit window parameters */ + pgm_assert (sqns || (tpdu_size && secs && max_rte)); ++ { + const unsigned alloc_sqns = sqns ? sqns : ( (secs * max_rte) / tpdu_size ); + window = pgm_malloc0 (sizeof(pgm_txw_t) + ( alloc_sqns * sizeof(struct pgm_sk_buff_t*) )); + window->tsi = tsi; +@@ -231,6 +232,7 @@ + pgm_assert (!pgm_txw_retransmit_can_peek (window)); + + return window; ++ } + } + + /* destructor for transmit window. must not be called more than once for same window. +@@ -316,6 +318,7 @@ + skb->sequence = window->lead; + + /* add skb to window */ ++ { + const uint_fast32_t index_ = skb->sequence % pgm_txw_max_length (window); + window->pdata[index_] = skb; + +@@ -325,6 +328,7 @@ + /* post-conditions */ + pgm_assert_cmpuint (pgm_txw_length (window), >, 0); + pgm_assert_cmpuint (pgm_txw_length (window), <=, pgm_txw_max_length (window)); ++ } + } + + /* peek an entry from the window for retransmission. +@@ -452,6 +456,7 @@ + pgm_assert (NULL != window); + pgm_assert_cmpuint (tg_sqn_shift, <, 8 * sizeof(uint32_t)); + ++ { + const uint32_t tg_sqn_mask = 0xffffffff << tg_sqn_shift; + const uint32_t nak_tg_sqn = sequence & tg_sqn_mask; /* left unshifted */ + const uint32_t nak_pkt_cnt = sequence & ~tg_sqn_mask; +@@ -490,6 +495,7 @@ + pgm_assert (!pgm_queue_is_empty (&window->retransmit_queue)); + state->waiting_retransmit = 1; + return TRUE; ++ } + } + + static +@@ -548,14 +554,17 @@ + pgm_debug ("retransmit_try_peek (window:%p)", (const void*)window); + + /* no lock required to detect presence of a request */ ++ { + pgm_list_t* tail_link = pgm_queue_peek_tail_link (&window->retransmit_queue); + if (PGM_UNLIKELY(NULL == tail_link)) { + pgm_debug ("retransmit queue empty on peek."); + return NULL; + } + ++ { + struct pgm_sk_buff_t* skb = (struct pgm_sk_buff_t*)tail_link; + pgm_assert (pgm_skb_is_valid (skb)); ++ { + pgm_txw_state_t* state = (pgm_txw_state_t*)&skb->cb; + + if (!state->waiting_retransmit) { +@@ -572,14 +581,17 @@ + } + + /* generate parity packet to satisify request */ ++ { + const uint8_t rs_h = state->pkt_cnt_sent % (window->rs.n - window->rs.k); + const uint32_t tg_sqn_mask = 0xffffffff << window->tg_sqn_shift; + const uint32_t tg_sqn = skb->sequence & tg_sqn_mask; + bool is_var_pktlen = FALSE; + bool is_op_encoded = FALSE; + uint16_t parity_length = 0; +- const pgm_gf8_t* src[ window->rs.k ]; +- for (uint_fast8_t i = 0; i < window->rs.k; i++) ++ const pgm_gf8_t** src = pgm_newa (pgm_gf8_t*, window->rs.k); ++ { ++ uint_fast8_t i; ++ for (i = 0; i < window->rs.k; i++) + { + const struct pgm_sk_buff_t* odata_skb = pgm_txw_peek (window, tg_sqn + i); + const uint16_t odata_tsdu_length = ntohs (odata_skb->pgm_header->pgm_tsdu_length); +@@ -599,6 +611,7 @@ + is_op_encoded = TRUE; + } + } ++ } + + /* construct basic PGM header to be completed by send_rdata() */ + skb = window->parity_buffer; +@@ -618,7 +631,9 @@ + { + skb->pgm_header->pgm_options |= PGM_OPT_VAR_PKTLEN; + +- for (uint_fast8_t i = 0; i < window->rs.k; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < window->rs.k; i++) + { + struct pgm_sk_buff_t* odata_skb = pgm_txw_peek (window, tg_sqn + i); + const uint16_t odata_tsdu_length = ntohs (odata_skb->pgm_header->pgm_tsdu_length); +@@ -632,6 +647,7 @@ + odata_skb->zero_padded = 1; + } + } ++ } + parity_length += 2; + } + +@@ -642,6 +658,7 @@ + + skb->pgm_data->data_sqn = htonl ( tg_sqn | rs_h ); + ++ { + void* data_bytes = skb->pgm_data + 1; + + /* encode every option separately, currently only one applies: opt_fragment +@@ -650,11 +667,14 @@ + { + skb->pgm_header->pgm_options |= PGM_OPT_PRESENT; + ++ { + struct pgm_opt_fragment null_opt_fragment; +- const pgm_gf8_t* opt_src[ window->rs.k ]; ++ const pgm_gf8_t** opt_src = pgm_newa (pgm_gf8_t*, window->rs.k); + memset (&null_opt_fragment, 0, sizeof(null_opt_fragment)); + *(uint8_t*)&null_opt_fragment |= PGM_OP_ENCODED_NULL; +- for (uint_fast8_t i = 0; i < window->rs.k; i++) ++ { ++ uint_fast8_t i; ++ for (i = 0; i < window->rs.k; i++) + { + const struct pgm_sk_buff_t* odata_skb = pgm_txw_peek (window, tg_sqn + i); + +@@ -669,8 +689,10 @@ + opt_src[i] = (pgm_gf8_t*)&null_opt_fragment; + } + } ++ } + + /* add options to this rdata packet */ ++ { + const uint16_t opt_total_length = sizeof(struct pgm_opt_length) + + sizeof(struct pgm_opt_header) + + sizeof(struct pgm_opt_fragment); +@@ -678,14 +700,17 @@ + /* add space for PGM options */ + pgm_skb_put (skb, opt_total_length); + ++ { + struct pgm_opt_length* opt_len = data_bytes; + opt_len->opt_type = PGM_OPT_LENGTH; + opt_len->opt_length = sizeof(struct pgm_opt_length); + opt_len->opt_total_length = htons ( opt_total_length ); ++ { + struct pgm_opt_header* opt_header = (struct pgm_opt_header*)(opt_len + 1); + opt_header->opt_type = PGM_OPT_FRAGMENT | PGM_OPT_END; + opt_header->opt_length = sizeof(struct pgm_opt_header) + sizeof(struct pgm_opt_fragment); + opt_header->opt_reserved = PGM_OP_ENCODED; ++ { + struct pgm_opt_fragment* opt_fragment = (struct pgm_opt_fragment*)(opt_header + 1); + + /* The cast below is the correct way to handle the problem. +@@ -700,6 +725,11 @@ + sizeof(struct pgm_opt_fragment) - sizeof(struct pgm_opt_header)); + + data_bytes = opt_fragment + 1; ++ } ++ } ++ } ++ } ++ } + } + + /* encode payload */ +@@ -710,9 +740,16 @@ + parity_length); + + /* calculate partial checksum */ ++ { + const uint16_t tsdu_length = ntohs (skb->pgm_header->pgm_tsdu_length); + state->unfolded_checksum = pgm_csum_partial ((char*)skb->tail - tsdu_length, tsdu_length, 0); + return skb; ++ } ++ } ++ } ++ } ++ } ++ } + } + + /* remove head entry from retransmit queue, will fail on assertion if queue is empty. +@@ -733,6 +770,7 @@ + (const void*)window); + + /* tail link is valid without lock */ ++ { + pgm_list_t* tail_link = pgm_queue_peek_tail_link (&window->retransmit_queue); + + /* link must be valid for pop */ +@@ -762,6 +800,7 @@ + pgm_queue_pop_tail_link (&window->retransmit_queue); + state->waiting_retransmit = 0; + } ++ } + } + + /* eof */ diff --git a/3rdparty/openpgm-svn-r1085/pgm/txw_unittest.c b/3rdparty/openpgm-svn-r1135/pgm/txw_unittest.c index bec079b..bec079b 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/txw_unittest.c +++ b/3rdparty/openpgm-svn-r1135/pgm/txw_unittest.c diff --git a/3rdparty/openpgm-svn-r1085/pgm/valgrind.supp b/3rdparty/openpgm-svn-r1135/pgm/valgrind.supp index ea74d2d..ea74d2d 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/valgrind.supp +++ b/3rdparty/openpgm-svn-r1135/pgm/valgrind.supp diff --git a/3rdparty/openpgm-svn-r1085/pgm/version_generator.py b/3rdparty/openpgm-svn-r1135/pgm/version_generator.py index 0db781b..9b48a3f 100755 --- a/3rdparty/openpgm-svn-r1085/pgm/version_generator.py +++ b/3rdparty/openpgm-svn-r1135/pgm/version_generator.py @@ -38,7 +38,7 @@ print """ const unsigned pgm_major_version = 5; const unsigned pgm_minor_version = 0; -const unsigned pgm_micro_version = 70; +const unsigned pgm_micro_version = 79; const char* pgm_build_date = "%s"; const char* pgm_build_time = "%s"; const char* pgm_build_system = "%s"; diff --git a/3rdparty/openpgm-svn-r1085/pgm/win/mingw32-runtime_3.13-1openpgm3.diff b/3rdparty/openpgm-svn-r1135/pgm/win/mingw32-runtime_3.13-1openpgm3.diff index 5b860a1..189c32d 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/win/mingw32-runtime_3.13-1openpgm3.diff +++ b/3rdparty/openpgm-svn-r1135/pgm/win/mingw32-runtime_3.13-1openpgm3.diff @@ -91,7 +91,7 @@ diff -urN include-original/ws2tcpip.h include/ws2tcpip.h + struct sockaddr_storage gf_group; + u_long gf_fmode; + u_long gf_numsrc; -+ struct in_addr gf_slist[1]; ++ struct sockaddr_storage gf_slist[1]; +}; + struct ip_msfilter { diff --git a/3rdparty/openpgm-svn-r1085/pgm/win/mingw32-runtime_3.15.2-0openpgm1.diff b/3rdparty/openpgm-svn-r1135/pgm/win/mingw32-runtime_3.15.2-0openpgm1.diff index b6e3d11..b9453eb 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/win/mingw32-runtime_3.15.2-0openpgm1.diff +++ b/3rdparty/openpgm-svn-r1135/pgm/win/mingw32-runtime_3.15.2-0openpgm1.diff @@ -113,7 +113,7 @@ diff -urN include-original/ws2tcpip.h include/ws2tcpip.h + struct sockaddr_storage gf_group; + u_long gf_fmode; + u_long gf_numsrc; -+ struct in_addr gf_slist[1]; ++ struct sockaddr_storage gf_slist[1]; +}; + struct ip_msfilter { diff --git a/3rdparty/openpgm-svn-r1085/pgm/win64/mingw-w64-bin_x86-64-linux_4.4.1-1openpgm1.diff b/3rdparty/openpgm-svn-r1135/pgm/win64/mingw-w64-bin_x86-64-linux_4.4.1-1openpgm1.diff index 237bcb3..d873544 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/win64/mingw-w64-bin_x86-64-linux_4.4.1-1openpgm1.diff +++ b/3rdparty/openpgm-svn-r1135/pgm/win64/mingw-w64-bin_x86-64-linux_4.4.1-1openpgm1.diff @@ -21,7 +21,7 @@ diff -urN include-original/./ws2tcpip.h x86_64-w64-mingw32/include/./ws2tcpip.h + struct sockaddr_storage gf_group; + u_long gf_fmode; + u_long gf_numsrc; -+ struct in_addr gf_slist[1]; ++ struct sockaddr_storage gf_slist[1]; +}; + struct ip_msfilter { diff --git a/3rdparty/openpgm-svn-r1085/pgm/wsastrerror.c b/3rdparty/openpgm-svn-r1135/pgm/wsastrerror.c index 2e21449..2e21449 100644 --- a/3rdparty/openpgm-svn-r1085/pgm/wsastrerror.c +++ b/3rdparty/openpgm-svn-r1135/pgm/wsastrerror.c |