summaryrefslogtreecommitdiffstats
path: root/3rdparty
diff options
context:
space:
mode:
authorSebastien Braun2010-10-03 16:14:44 +0200
committerSebastien Braun2010-10-03 16:14:44 +0200
commitffee0868ef1341cfb7622821431cb73c52590962 (patch)
treebc96be65e0346ea25a8effb2118de59b08d54466 /3rdparty
parentAdd patch for OpenPGM to fix switch() fallthrough (diff)
downloadpvs-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.patch11
-rw-r--r--3rdparty/openpgm-svn-r1135-0001-sigsegv-in-txw.patch28
-rw-r--r--3rdparty/openpgm-svn-r1135-0002-correct-checksum-calculation.patch17
-rw-r--r--3rdparty/openpgm-svn-r1135-0003-fix-rdata-congestion-control.patch42
-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.patch58
-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-x3rdparty/openpgm-svn-r1135/pgm/galois_generator.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/galois_generator.pl)0
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/gcov-parse.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/gcov-parse.pl)0
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/gcov-seed.sh (renamed from 3rdparty/openpgm-svn-r1085/pgm/gcov-seed.sh)0
-rwxr-xr-x3rdparty/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.patch218
-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.patch59
-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.patch53
-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.patch47
-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.patch212
-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-x3rdparty/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.patch376
-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.patch44
-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.patch29
-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.patch76
-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.patch16
-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.patch34
-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.patch145
-rwxr-xr-x3rdparty/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.patch91
-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.patch89
-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.patch67
-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.patch121
-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.patch401
-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.patch34
-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.patch62
-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.patch887
-rw-r--r--3rdparty/openpgm-svn-r1135/pgm/receiver.c.rej37
-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.patch404
-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.patch467
-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.patch565
-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.patch75
-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.patch403
-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.patch1021
-rw-r--r--3rdparty/openpgm-svn-r1135/pgm/source.c.orig2344
-rw-r--r--3rdparty/openpgm-svn-r1135/pgm/source.c.rej17
-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.patch39
-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-x3rdparty/openpgm-svn-r1135/pgm/test/ambient_spm.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ambient_spm.pl)1
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/apdu.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/apdu.pl)2
-rwxr-xr-x3rdparty/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-x3rdparty/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-x3rdparty/openpgm-svn-r1135/pgm/test/nak.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/nak_cancellation.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak_cancellation.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/nak_list.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak_list.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/nak_parity.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak_parity.pl)0
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/nak_repeat.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/nak_repeat.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/ncf.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ncf.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/ncf_cancellation.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ncf_cancellation.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/ncf_list.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ncf_list.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/ncf_suppression.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/ncf_suppression.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/odata.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata.pl)1
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/odata_completion.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_completion.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/odata_jump.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_jump.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/odata_jump_parity.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_jump_parity.pl)0
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/odata_number.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_number.pl)1
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/odata_rate.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_rate.pl)1
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/odata_reception.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/odata_reception.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/on-demand_spm.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/on-demand_spm.pl)0
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/outofwindow_ncf.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/outofwindow_ncf.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/rdata_completion_parity.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/rdata_completion_parity.pl)0
-rwxr-xr-x3rdparty/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-x3rdparty/openpgm-svn-r1135/pgm/test/rdata_jump.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/rdata_jump.pl)2
-rwxr-xr-x3rdparty/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-x3rdparty/openpgm-svn-r1135/pgm/test/spm.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spm.pl)1
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/spm_jump.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spm_jump.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/spm_jump2.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spm_jump2.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/spm_reception.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spm_reception.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/spmr.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spmr.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/spmr_after_spm.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spmr_after_spm.pl)2
-rwxr-xr-x3rdparty/openpgm-svn-r1135/pgm/test/spmr_from_odata.pl (renamed from 3rdparty/openpgm-svn-r1085/pgm/test/spmr_from_odata.pl)2
-rwxr-xr-x3rdparty/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.patch137
-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.patch115
-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.patch63
-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.patch33
-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.patch223
-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-x3rdparty/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, &not_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