v1.5b1
parent
8e24aea5ed
commit
4ecd0ad025
|
|
@ -0,0 +1,72 @@
|
||||||
|
Building NORM
|
||||||
|
=============
|
||||||
|
|
||||||
|
NORM can be built using the Waf build tool, included in the distribution.
|
||||||
|
To see a full list of options, run:
|
||||||
|
|
||||||
|
./waf -h
|
||||||
|
|
||||||
|
|
||||||
|
Configuring
|
||||||
|
-----------
|
||||||
|
|
||||||
|
To perform the configure checks, run:
|
||||||
|
|
||||||
|
./waf configure
|
||||||
|
|
||||||
|
Some options for the configure step:
|
||||||
|
|
||||||
|
--prefix=<DIR> - Directory to install files to (Default - /usr/local)
|
||||||
|
|
||||||
|
--debug - Builds a debug build (with debugging symbols), otherwise an
|
||||||
|
optimized library is built.
|
||||||
|
|
||||||
|
--build-python - Builds the Python extension
|
||||||
|
--build-java - Builds the Java extension
|
||||||
|
You must set the JAVA_HOME environment variable to the location of your
|
||||||
|
JDK directory
|
||||||
|
|
||||||
|
Building
|
||||||
|
--------
|
||||||
|
|
||||||
|
To build the library, simply run:
|
||||||
|
|
||||||
|
./waf
|
||||||
|
|
||||||
|
To build examples along with the library, run:
|
||||||
|
|
||||||
|
./waf --targets=ex1,ex2,...
|
||||||
|
|
||||||
|
Where ex1,ex2 is the name of the example you want to build (see ./waf list).
|
||||||
|
Additionally, you can add the "--targets=*" flag to build all the example
|
||||||
|
programs.
|
||||||
|
|
||||||
|
Installing
|
||||||
|
----------
|
||||||
|
|
||||||
|
To install, run:
|
||||||
|
|
||||||
|
./waf install
|
||||||
|
|
||||||
|
This will install the compiled library and headers to wherever your prefix was
|
||||||
|
specified. (See configure flags)
|
||||||
|
|
||||||
|
Uninstalling
|
||||||
|
------------
|
||||||
|
|
||||||
|
Waf tracks the files it installs, so run:
|
||||||
|
|
||||||
|
./waf uninstall
|
||||||
|
|
||||||
|
to remove all files from a previous ./waf install
|
||||||
|
|
||||||
|
Cleaning
|
||||||
|
--------
|
||||||
|
|
||||||
|
./waf clean
|
||||||
|
|
||||||
|
will delete all compiled files and configuration settings.
|
||||||
|
|
||||||
|
./waf distclean
|
||||||
|
|
||||||
|
will do the same as clean, and additionally delete the waf cache files.
|
||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
|
@ -0,0 +1,177 @@
|
||||||
|
NORM SOCKET BINDING NOTES
|
||||||
|
=========================
|
||||||
|
|
||||||
|
NORM supports a number of socket binding options to allow for multiple paradigms of use. The default operation of NORM involves two separate sockets:
|
||||||
|
|
||||||
|
1) a "tx_socket" used for sender transmission and reception of unicast feedback, and
|
||||||
|
2) a "rx_socket" used for reception of packets sent to the "session" address/port
|
||||||
|
|
||||||
|
By default both sockets are bound to INADDR_ANY with the rx_socket using the "session port" number and the
|
||||||
|
tx_socket using a port freely assigned by the operating system unless the NormSetTxPort() API is invoked. The INADDR_ANY binding allows the sockets to receive packets from any remote address/port thus support NORM's typical multicast operation compatible with both unicast and multicast feedback and even "many-to-one" unicast reception (if unicast feedback is set via NormSetDefaultUnicastNack()).
|
||||||
|
|
||||||
|
Some optional binding behaviors are invoked depending upon some additional NORM API calls. For example, the "rx_socket" can be optionally bound to the session address. This restricts the rx_socket to receive only packets specifically directed to the configured session address. The session address must be a multicast address or valid local IP address for this to work. And in the latter case, the NormSession MUST be operated
|
||||||
|
only as a NORM receiver (i.e., NormStartSender() will result in transmissions to self only!)
|
||||||
|
|
||||||
|
The rationale for the separate tx_socket and rx_socket usage was to enable NORM senders to detect when unicast feedback is used so that proper protocol behaviors are invoked (e.g. NORM_CMD(REPAIR_ADV)). Note that the code base _may_ be eventually updated so this is no longer necessary (e.g. through use of the "recvmsg()" system call
|
||||||
|
with proper socket configuration to receive UDP packet destination address header information). It may still be the case that a use case for separate send/recv sockets may persist and the code will continue to support that although it is possible that it may become the optional behavior rather than the default.
|
||||||
|
|
||||||
|
bind semantics: localAddr / localPort
|
||||||
|
|
||||||
|
connect semantics: remoteAddr / remotePort
|
||||||
|
|
||||||
|
+-------------------------------+-------------------------------+---------------------------------------+
|
||||||
|
| bind() state | connect() state | |
|
||||||
|
+---------------+---------------+---------------+---------------+ Behaviors |
|
||||||
|
| localAddr | localPort | remoteAddr | remotePort | |
|
||||||
|
+---------------+---------------+---------------+---------------+---------------------------------------+
|
||||||
|
| INADDR_ANY | 0 | NONE | OS-assigned port, sendto() any |
|
||||||
|
+---------------+---------------+---------------+---------------+---------------------------------------+
|
||||||
|
| INADDR_ANY | <port> | NONE | from any to <*/port>, sendto() any |
|
||||||
|
+---------------+---------------+---------------+---------------+---------------------------------------+
|
||||||
|
| <addr> | <port> | NONE | from any to <addr/port>. sendto() any |
|
||||||
|
+---------------+---------------+---------------+---------------+---------------------------------------+
|
||||||
|
| INADDR_ANY | <port> | remoteAddr | remotePort | from remote to <*/port> |
|
||||||
|
+---------------+---------------+---------------+---------------+---------------------------------------+
|
||||||
|
| <addr> | <port> | remoteAddr | remotePort | from remote to <addr/port> only |
|
||||||
|
+---------------+---------------+---------------+---------------+---------------------------------------+
|
||||||
|
|
||||||
|
The Rules:
|
||||||
|
|
||||||
|
If you don't bind(), you don't receive anything.
|
||||||
|
|
||||||
|
If you connect() you can only send to the specified connected addr / port.
|
||||||
|
|
||||||
|
Cannot connect to multicast addr.
|
||||||
|
|
||||||
|
Can only bind to multicast or valid local IP addr
|
||||||
|
|
||||||
|
With port reuse, each multicast socket will get a copy of matching inbound multicast packets. In fact, with an INADDR_ANY bind, the socket will get packets for _any_ group joined if the port number matches. But with an inbound unicast packet, only one socket with closest matching binding will get the packet. This includes
|
||||||
|
the bind() (i.e. local addr/port) _and_ connect() (i.e. remote addr/port) state with regard to the incoming packet where the most specific match is considered the best match.
|
||||||
|
|
||||||
|
Thus these bind/connect combinations are important in order to achieve some desired set of behaviors.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DESIRED BEHAVIORS:
|
||||||
|
|
||||||
|
1) NORM sender / receiver operation with feedback to the session port and/or unicast feedback.
|
||||||
|
|
||||||
|
|
||||||
|
2) Binding packet reception for socket(s) to specific address(es) with or without port reuse
|
||||||
|
|
||||||
|
NormSetTxPort() currently has option to bind the tx_socket to a specific local address (txAddress)
|
||||||
|
NormSetRxPortReuse() currently has option to bind rx_socket to multicast session address.
|
||||||
|
|
||||||
|
TBD - Need to add "NormSetRxAddress()" to bind rx_socket to non-session local address
|
||||||
|
|
||||||
|
|
||||||
|
3) Connecting socket(s) to remote unicast addr/port so that reused port demuxing works properly
|
||||||
|
(This is probably applicable only to unicast sessions)
|
||||||
|
|
||||||
|
So, the following conditions should be true to "connect" the socket:
|
||||||
|
|
||||||
|
1) Session address is unicast
|
||||||
|
2) Port reuse is true.
|
||||||
|
|
||||||
|
XXX - finish these thoughts and revise the implementation!!!!!
|
||||||
|
|
||||||
|
REQUIREMENTS
|
||||||
|
|
||||||
|
|
||||||
|
Enumerate some use cases and the corresponding socket behavior requirements
|
||||||
|
|
||||||
|
1) Default: sender/receiver multicast operation w/ mcast and ucast feedback
|
||||||
|
|
||||||
|
tx_socket : sendto() session addr/port,sender(s) addr/port
|
||||||
|
recvfrom() receiver src addr/port to local ucast addr
|
||||||
|
rx_socket : recvfrom() sender addr/port to session addr/port
|
||||||
|
|
||||||
|
If rxAddr is unspecified, can also receive to unicast
|
||||||
|
|
||||||
|
2) Sender-only one-to-many
|
||||||
|
|
||||||
|
tx_socket : sendto() session addr/port,sender(s) addr/port
|
||||||
|
recvfrom() receiver src addr/port to local ucast addr
|
||||||
|
|
||||||
|
rx_socket : recvfrom() sender addr/port to session addr/port (mcast feedback)
|
||||||
|
|
||||||
|
|
||||||
|
3) Receive-only many-to-one unicasts
|
||||||
|
|
||||||
|
tx_socket : sendto() senders addr/port
|
||||||
|
rx_socket : recvfrom() senders addr/port to session port
|
||||||
|
|
||||||
|
4) Bi-directional unicast
|
||||||
|
|
||||||
|
tx_socket : sendto() session addr/port
|
||||||
|
rx_socket : recvfrom() session addr/* to session port
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IMPLEMENTATION NOTES:
|
||||||
|
|
||||||
|
1) Default binding
|
||||||
|
|
||||||
|
rx_socket : INADDR_ANY / <sessionPort>
|
||||||
|
|
||||||
|
tx_socket : INADDR_ANY / 0 (any port)
|
||||||
|
|
||||||
|
Implementation Details:
|
||||||
|
|
||||||
|
This is the default behavior if none of the additional API calls described below are made.
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
2) The NormSetTxPort(txPort, enableReuse, txAddr) lets this be modified by:
|
||||||
|
|
||||||
|
a) if (txPort != sessionPort) tx_socket is bound to <txPort>
|
||||||
|
b) if (txPort == sessionPort) rx_socket is used for transmission, too
|
||||||
|
|
||||||
|
c) if "enableReuse" is true, PORT/ADDR REUSE is set for tx_socket
|
||||||
|
|
||||||
|
d) if txAddr is valid, the tx_socket (or (TBD) rx_socket if txPort == sessionPort) is bound
|
||||||
|
to the given <txAddr> which must be a valid IP addr for the host (This means only
|
||||||
|
unicast packets for that address are received on that socket. Thus the binding is _not_
|
||||||
|
made for the rx_socket case if the session address is a multicast address!
|
||||||
|
|
||||||
|
|
||||||
|
Implementation Details:
|
||||||
|
|
||||||
|
TBD
|
||||||
|
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
3) The NormSetRxPortReuse(enable, bindToSessionAddr) modifies the default binding as follows:
|
||||||
|
|
||||||
|
a) If <enable> is "true", PORT/ADDR REUSE is set for the rx_socket
|
||||||
|
|
||||||
|
b) if <bindToSessionAddr> is "true" _and_ the session address is multicast, the rx_socket
|
||||||
|
binding is <sessionAddr> / <sessionPort>. This enables the same port number to be
|
||||||
|
reused for different multicast session addresses _and_ restricts the rx_socket to receive
|
||||||
|
only packets destined for the sessionAddr. In this case, unicast feedback to the rx_socket
|
||||||
|
(i.e. in the case of above where txPort == sessionPort) will NOT work!
|
||||||
|
TBD - The code resolves this conflict by ...
|
||||||
|
|
||||||
|
|
||||||
|
Implementation Details:
|
||||||
|
|
||||||
|
TBD
|
||||||
|
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
4) The NormSetTxOnly() causes only the tx_socket to be opened and no rx_socket is opened. In fact,
|
||||||
|
the rx_socket is closed if it is already open (unless txPort == sessionPort ala above)
|
||||||
|
|
||||||
|
|
||||||
|
Implementation Details:
|
||||||
|
|
||||||
|
TBD
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,83 @@
|
||||||
|
Java JNI bindings for NORM
|
||||||
|
==========================
|
||||||
|
|
||||||
|
By:
|
||||||
|
Jason Rush <jason.rush@gd-ais.com>
|
||||||
|
Peter Griffin <peter.griffin@gd-ais.com>
|
||||||
|
|
||||||
|
The Java JNI bindings for NORM provide Java bindings for the NORM C API.
|
||||||
|
|
||||||
|
For documentation about the main NORM API calls, refer to the NORM Developers
|
||||||
|
guide in the regular NORM distribution.
|
||||||
|
|
||||||
|
------------
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
Java JNI bindings for NORM requires at least Java 1.5; however, it has also
|
||||||
|
been tested with Java 1.6.
|
||||||
|
|
||||||
|
The NORM library should be built prior to building the Java JNI bindings since
|
||||||
|
they link against it.
|
||||||
|
|
||||||
|
Apache Ant is required for building the class files and jar file.
|
||||||
|
|
||||||
|
------------
|
||||||
|
Building
|
||||||
|
------------
|
||||||
|
|
||||||
|
The build files for Java JNI bindings for NORM are located in the
|
||||||
|
makefiles/java directory.
|
||||||
|
|
||||||
|
To build the NORM jar file, execute Apache Ant in the makefiles/java directory:
|
||||||
|
|
||||||
|
ant jar
|
||||||
|
|
||||||
|
This will produce a norm-<version>.jar file in the lib/ directory.
|
||||||
|
|
||||||
|
To build the accompanying NORM native bindings library, execute make in the
|
||||||
|
makefiles/java directory with the correct make file for your system:
|
||||||
|
|
||||||
|
make -f Makefile.linux
|
||||||
|
|
||||||
|
This will produce a libmil_navy_nrl_norm.so file in the lib/ directory.
|
||||||
|
|
||||||
|
------------
|
||||||
|
Installation
|
||||||
|
------------
|
||||||
|
|
||||||
|
The norm-<version>.jar file must be on the classpath.
|
||||||
|
|
||||||
|
The libmil_navy_nrl_norm.so file must be installed in a location that Java
|
||||||
|
will search at runtime for native libraries. The search path is dependent
|
||||||
|
upon the operating system:
|
||||||
|
|
||||||
|
Windows:
|
||||||
|
Windows system directories
|
||||||
|
Current working directory
|
||||||
|
PATH environment variable
|
||||||
|
|
||||||
|
Unix:
|
||||||
|
Current working directory
|
||||||
|
LD_LIBRARY_PATH environment variable
|
||||||
|
|
||||||
|
You can also specify the directory with the java.library.path Java system
|
||||||
|
property on startup:
|
||||||
|
|
||||||
|
java -Djava.library.path=<dir> ...
|
||||||
|
|
||||||
|
Finally the native library can also be installed in the JRE's library
|
||||||
|
directory. This allows all programs that use the JRE to access the library:
|
||||||
|
|
||||||
|
<JRE_HOME>/lib/i386/
|
||||||
|
|
||||||
|
If you observe an "java.lang.UnsatisfiedLinkError" exception while running
|
||||||
|
your application, you do not have the libmil_navy_nrl_norm.so installed in
|
||||||
|
the correct location.
|
||||||
|
|
||||||
|
------------
|
||||||
|
Examples
|
||||||
|
------------
|
||||||
|
|
||||||
|
Examples using the Java JNI bindings for NORM are provided in the examples/java
|
||||||
|
directory.
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
PyNORM - Python Wrapper for NORM & Extras
|
||||||
|
=========================================
|
||||||
|
|
||||||
|
By: Tom Wambold <wambold@itd.nrl.navy.mil>
|
||||||
|
|
||||||
|
PyNORM provides a thin wrapper around the NORM C API in the main package. It
|
||||||
|
also provides several additional modules in the extra package to provide higher
|
||||||
|
level usage of NORM.
|
||||||
|
|
||||||
|
For documentation about the main NORM API calls, refer to the NORM Developers
|
||||||
|
guide in the regular NORM distribution.
|
||||||
|
|
||||||
|
Also, the files in the examples/python directory have a lot of good info on how
|
||||||
|
to use the library. For simple apps, see the normFileSend and normFileReceive
|
||||||
|
scripts.
|
||||||
|
|
||||||
|
------------
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
PyNORM has been tested on Python versions 2.5 and 2.6. The code may work on
|
||||||
|
earlier versions, but was not tested.
|
||||||
|
|
||||||
|
PyNORM requires NORM to be built as a shared library (.so, .dylib, .dll), so
|
||||||
|
that Python's "ctypes" module can load it. Ctypes will look for the library
|
||||||
|
in similar places as your system's compiler. On UNIX systems, this is usually
|
||||||
|
/usr/lib and /usr/local/lib, etc. On Windows, this searches folders in the
|
||||||
|
PATH environment variable.
|
||||||
|
|
||||||
|
On Windows, PyNORM requires the "PyWin32" module, available at:
|
||||||
|
http://sf.net/projects/pywin32
|
||||||
|
|
||||||
|
-----------------------
|
||||||
|
"Extra" Package Modules
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
manager.py:
|
||||||
|
This provides a callback-driven event loop for NORM. It operates on a
|
||||||
|
separate thread, calling registered functions in response to NORM events.
|
||||||
|
|
||||||
|
logparser.py:
|
||||||
|
This provides a function to reads NORM debug "reports" (printed at debug
|
||||||
|
level 3 or higher) from a log file, and parses them into Python objects.
|
||||||
20
README.md
20
README.md
|
|
@ -13,16 +13,11 @@ modification, are permitted provided that:
|
||||||
|
|
||||||
(1) source code distributions retain this paragraph in its entirety,
|
(1) source code distributions retain this paragraph in its entirety,
|
||||||
|
|
||||||
(2) distributions including binary code include this paragraph in
|
(2) all advertising materials mentioning features or use of this
|
||||||
its entirety in the documentation or other materials provided
|
|
||||||
with the distribution, and
|
|
||||||
|
|
||||||
(3) all advertising materials mentioning features or use of this
|
|
||||||
software display the following acknowledgment:
|
software display the following acknowledgment:
|
||||||
|
|
||||||
"This product includes software written and developed
|
"This product includes software written and developed
|
||||||
by Brian Adamson and Joe Macker of the Naval Research
|
by the Naval Research Laboratory (NRL)."
|
||||||
Laboratory (NRL)."
|
|
||||||
|
|
||||||
The name of NRL, the name(s) of NRL employee(s), or any entity
|
The name of NRL, the name(s) of NRL employee(s), or any entity
|
||||||
of the United States Government may not be used to endorse or
|
of the United States Government may not be used to endorse or
|
||||||
|
|
@ -43,7 +38,7 @@ purposes, the authors would prefer that the code not be
|
||||||
re-distributed so that users will obtain the latest (and most
|
re-distributed so that users will obtain the latest (and most
|
||||||
debugged/improved) release from the official NORM web site:
|
debugged/improved) release from the official NORM web site:
|
||||||
|
|
||||||
<http://norm.pf.itd.nrl.navy.mil>
|
<http://cs.itd.nrl.navy.mil/work/norm>
|
||||||
|
|
||||||
|
|
||||||
SOURCE CODE
|
SOURCE CODE
|
||||||
|
|
@ -63,15 +58,14 @@ The following items can be build from this source code release:
|
||||||
be provided as additional documentation in the future)
|
be provided as additional documentation in the future)
|
||||||
|
|
||||||
|
|
||||||
3) norm (or norm.exe (WIN32) - command-line "demo" application
|
2) norm (or norm.exe (WIN32) - command-line "demo" application
|
||||||
built from "common/normApp.cpp"
|
built from "common/normApp.cpp"
|
||||||
|
|
||||||
(The included "Norm User's Guide" provides a rough overview
|
(The included "Norm User's Guide" provides a rough overview
|
||||||
of how to use this demo app. This document requires some
|
of how to use this demo app. This demo application
|
||||||
updating to be accurate and complete. This demo application
|
|
||||||
is useful for file transfers (and streaming on Unix))
|
is useful for file transfers (and streaming on Unix))
|
||||||
|
|
||||||
4) normTest (or normTest.exe (WIN32)) - very simple test application
|
3) normTest (or normTest.exe (WIN32)) - very simple test application
|
||||||
|
|
||||||
(The "normTest" application (see "common/normTest.cpp") is really
|
(The "normTest" application (see "common/normTest.cpp") is really
|
||||||
just a simple playground for preliminary testing of the NORM
|
just a simple playground for preliminary testing of the NORM
|
||||||
|
|
@ -80,7 +74,7 @@ The following items can be build from this source code release:
|
||||||
(and better-documented) examples of NORM API usage will be
|
(and better-documented) examples of NORM API usage will be
|
||||||
provided in the future.
|
provided in the future.
|
||||||
|
|
||||||
5) There is also an "examples" directory in the source code tree
|
4) There is also an "examples" directory in the source code tree
|
||||||
that contains some simplified examples of NORM API usage. The
|
that contains some simplified examples of NORM API usage. The
|
||||||
example set will be expanded as time progresses.
|
example set will be expanded as time progresses.
|
||||||
|
|
||||||
|
|
|
||||||
67
TODO.TXT
67
TODO.TXT
|
|
@ -1,12 +1,44 @@
|
||||||
|
TODO:
|
||||||
|
|
||||||
0) Fix implementation of NORM_DATA_FLAG_REPAIR.
|
0) Fix implementation of NORM_DATA_FLAG_REPAIR.
|
||||||
|
|
||||||
|
2) Add mechanism to allow window-based control of NORM server
|
||||||
|
transmission rate.
|
||||||
|
|
||||||
|
7) Build "norm daemon" using API.
|
||||||
|
|
||||||
|
10) Release wxNormChat project
|
||||||
|
|
||||||
|
11) Test, release "naft" (updated "raft") for reliable UDP streaming.
|
||||||
|
|
||||||
|
13) Fix ns-2 issue when Agent/NORM is attached to ns-2 node ZERO and
|
||||||
|
results in a NormNode attempting to be assigned NORM_NODE_NONE as
|
||||||
|
a node id.
|
||||||
|
|
||||||
|
14) IMPORTANT: double check ACKing in reponse to watermark polling and
|
||||||
|
relation to cc feedback suppression, etc ... watermark acks should
|
||||||
|
be unicast and not affect cc feedback?
|
||||||
|
|
||||||
|
17) Set objectId in TX_FLUSH_COMPLETED and TX_WATERMARK_COMPLETED events.
|
||||||
|
|
||||||
|
18) Add APIs for managing remote server state kept at receiver
|
||||||
|
|
||||||
|
22) Implement LDPC FEC code within NORM as alternative to Reed Solomon
|
||||||
|
|
||||||
|
23) Add ability to control receiver cache on a per-sender basis?
|
||||||
|
(max_pending_range, etc)
|
||||||
|
|
||||||
|
26) Add API calls to get error information
|
||||||
|
|
||||||
|
27) Add API calls to read logged statistics
|
||||||
|
|
||||||
|
=========================
|
||||||
|
COMPLETED:
|
||||||
|
|
||||||
1) Implement unicast feedback of NACK messages and server
|
1) Implement unicast feedback of NACK messages and server
|
||||||
re-advertisement for suppressing the unicast feedback.
|
re-advertisement for suppressing the unicast feedback.
|
||||||
(COMPLETED)
|
(COMPLETED)
|
||||||
|
|
||||||
2) Add mechanism to allow window-based control of NORM server
|
|
||||||
transmission rate.
|
|
||||||
|
|
||||||
3) Implement TFMCC and/or PGM-CC congestion control mechanisms
|
3) Implement TFMCC and/or PGM-CC congestion control mechanisms
|
||||||
within NORM. (TFMCC COMPLETED)
|
within NORM. (TFMCC COMPLETED)
|
||||||
|
|
||||||
|
|
@ -24,35 +56,17 @@
|
||||||
6) Implement and document simple API to control and access NORM
|
6) Implement and document simple API to control and access NORM
|
||||||
features. (COMPLETED and enhancement in progress)
|
features. (COMPLETED and enhancement in progress)
|
||||||
|
|
||||||
7) Build "norm daemon" using API.
|
8) JAVA API for NRL NORM Protocol library (COMPLETED - Thanks Peter Griffin & Jason Rush)
|
||||||
|
|
||||||
8) JAVA API for NRL NORM Protocol library
|
9) Correct/complete user guide for "norm" demo app (COMPLETED)
|
||||||
|
|
||||||
9) Correct/complete user guide for "norm" demo app
|
|
||||||
|
|
||||||
10) Release wxNormChat project
|
|
||||||
|
|
||||||
11) Test, release "naft" (updated "raft") for reliable streaming.
|
|
||||||
|
|
||||||
12) Can we eliminate rapid clr norm-cc probing when data is
|
12) Can we eliminate rapid clr norm-cc probing when data is
|
||||||
not being actively sent? (COMPLETED)
|
not being actively sent? (COMPLETED)
|
||||||
|
|
||||||
13) Fix ns-2 issue when Agent/NORM is attached to ns-2 node ZERO and
|
|
||||||
results in a NormNode attempting to be assigned NORM_NODE_NONE as
|
|
||||||
a node id.
|
|
||||||
|
|
||||||
14) IMPORTANT: double check ACKing in reponse to watermark polling and
|
|
||||||
relation to cc feedback suppression, etc ... watermark acks should
|
|
||||||
be unicast and not effect cc feedback?
|
|
||||||
|
|
||||||
15) Implement TX_OBJECT_SENT event (COMPLETED)
|
15) Implement TX_OBJECT_SENT event (COMPLETED)
|
||||||
|
|
||||||
16) Set NORM_DATA "NORM_FLAG_REPAIR" properly
|
|
||||||
|
|
||||||
17) Set objectId in TX_FLUSH_COMPLETED and TX_WATERMARK_COMPLETED events.
|
|
||||||
|
|
||||||
18) Add APIs for managing remote server state kept at receiver
|
|
||||||
|
|
||||||
19) Fix "activity_timer" interval setting (COMPLETED)
|
19) Fix "activity_timer" interval setting (COMPLETED)
|
||||||
|
|
||||||
20) Fix issue related to setting tx cache count_max > 256!
|
20) Fix issue related to setting tx cache count_max > 256!
|
||||||
|
|
@ -63,12 +77,7 @@
|
||||||
(COMPLETED - reimplemented, adding tx_repair_pending index to use
|
(COMPLETED - reimplemented, adding tx_repair_pending index to use
|
||||||
instead of seeking each time)
|
instead of seeking each time)
|
||||||
|
|
||||||
22) Implement LDPC FEC code within NORM as alternative to Reed Solomon
|
|
||||||
|
|
||||||
23) Add ability to control receiver cache on a per-sender basis?
|
|
||||||
(max_pending_range, etc)
|
|
||||||
|
|
||||||
24) Look at NormStreamObject::StreamAdvance() for "push-enabled" streams
|
24) Look at NormStreamObject::StreamAdvance() for "push-enabled" streams
|
||||||
(COMPLETED)
|
(COMPLETED)
|
||||||
|
|
||||||
|
25) Improved, consistent socket binding options
|
||||||
|
|
|
||||||
136
VERSION.TXT
136
VERSION.TXT
|
|
@ -1,5 +1,138 @@
|
||||||
NORM Version History
|
NORM Version History
|
||||||
|
|
||||||
|
Version 1.5b1
|
||||||
|
=============
|
||||||
|
- Added option to set NORM receiver "rx cache count max", i.e. the
|
||||||
|
maximum number of pending object for which the receiver will keep
|
||||||
|
state (per sender). The "NormSetRxCacheLimit()" API call was added
|
||||||
|
to control this option.
|
||||||
|
- Implemented timer-based flow control so that NORM sender apps will not
|
||||||
|
force purge of old buffered objects (or stream data) for which there is
|
||||||
|
"recent" NACK activity. What is considered "recent" is based upon
|
||||||
|
"flowControlFactor*GRTT_sender*(1 + backoffFactor)". Note that a
|
||||||
|
"flowControlFactor" of 2.0 is default, but can be adjusted. A
|
||||||
|
new API call "NormSetFlowControl()" will be provided for this. Note that
|
||||||
|
if insufficient buffering is allocated, this flow control may limit
|
||||||
|
transmission rate for a given (delay*bandwidth, packetLoss conditions.
|
||||||
|
However, the likely alternative (if flow control is disabled) is that
|
||||||
|
reliability would not be perfectly maintained. Note that enabling the
|
||||||
|
sender "push" option of course overrides the flow control for streams.
|
||||||
|
For file/data objects, the app could choose to explicitly cancel
|
||||||
|
(dequeue) objects or disable the flow control if the app wishes to "push
|
||||||
|
ahead" regardless of impact to reliability. Note that when "pushing",
|
||||||
|
NORM strives to provide whatever reliability is possible given the
|
||||||
|
buffering/delay/bandwidth constraints the app imposes.
|
||||||
|
- Fixed problem with NormServeNode::PassiveRepairCheck() that caused
|
||||||
|
NORM to sometimes falsely acknowledge an object that was not yet
|
||||||
|
received (Thanks to Jeff Bush for finding this one).
|
||||||
|
- Added initial option for Explicit Congestion Notification (ECN) support
|
||||||
|
in "real-world" code. This includes raw packet capture (via ProtoCap)
|
||||||
|
so that ECN header info can be examined and setting ECT-Capable Transport
|
||||||
|
(ECT) bits in IP TOS/Trafffic Class header field.
|
||||||
|
- Fixed bug in NORM API "NormFileGetName()" call that would overrun buffer
|
||||||
|
(Thanks to Adrian Cox)
|
||||||
|
- Fixed bug with NORM probe_timer "lockup" when tx_rate is set to 0.0
|
||||||
|
(Thanks again to Adrian Cox)
|
||||||
|
- Added experimental receiver "real-time" buffer management option.
|
||||||
|
(not yet in API). Causes receiver to enqueue new data in favor of
|
||||||
|
old, incomplete data when buffer-constrained. _May_ be useful for
|
||||||
|
apps where receipt of "fresh" data is more important than reliability.
|
||||||
|
- Added "requeue" option to "norm" test app to allow multiple retransmissions
|
||||||
|
of a file to be "stitched" together by a NORM receiver. See the
|
||||||
|
NormRequeueObject() API call. Thanks to Keith Hogie/ Ed Criscuolo
|
||||||
|
for suggesting this.
|
||||||
|
- Enhanced NormSetRxPortReuse() behavior when bindSessionToAddr is true
|
||||||
|
such that for unicast sessions a UDP socket "connect()" call is made
|
||||||
|
to effectively "bind" the NormSession rx_socket to the remote
|
||||||
|
unicast addr. This _should_ enable proper demultiplexing of
|
||||||
|
multiple unicast sessions using the same port. (Note that this
|
||||||
|
same technique _may_ be adopted in the future for Source-Specific
|
||||||
|
Multicast (SSM) support as well where a NormSession is associated
|
||||||
|
with a specific remote single sender.)
|
||||||
|
- Added code to NormServerNode::Activate() so that when a previously
|
||||||
|
INACTIVE remote sender becomes active again (reactivated) that
|
||||||
|
the receiver automatically kicks off a new cycle of self-initiated
|
||||||
|
NACKing for any pending objects. Note this code applies when
|
||||||
|
the "reactivation" is due to a non-object message (e.g. NORM_CMD)
|
||||||
|
as reception of an object message (NORM_DATA/ NORM_INFO) will
|
||||||
|
re-awaken NACKing as needed anyway.
|
||||||
|
(Thanks to Jeff Bush for helping determine the utility of this)
|
||||||
|
- The NORM source code tree has been re-organized.
|
||||||
|
- Added Python language binding to NORM API, examples, etc
|
||||||
|
(Thanks to Tom Wambold)
|
||||||
|
- Added WAF build scripts, etc (Thanks again to Tom Wambold)
|
||||||
|
- iPhone Makefile added (Thanks yet again to Tom Wambold)
|
||||||
|
- Bug fix to NORM receiver "rx_object_table" and "rx_pending_mask"
|
||||||
|
interplay in NormSenderNode class. (Thanks to Dave Talmage for
|
||||||
|
stressing NORM enough to find this)
|
||||||
|
- Bug fix with parsing of "limit" command in normApp.cpp
|
||||||
|
(Thanks again to Dave Talmage)
|
||||||
|
- Fixed bug in "NormSessionMgr::NewSession()" where a call
|
||||||
|
was made to NormSession::SetTxPort() that should not
|
||||||
|
have been!
|
||||||
|
- Changed API calls to use "SetTx-XXX" and "SetRx-XXX" more
|
||||||
|
consistently instead of "SetTransmit-XXX", etc. Sorry for
|
||||||
|
a change to a couple of key API calls, but this will be
|
||||||
|
nicer in the long term.
|
||||||
|
- Fixed problems with NormSession::SenderQueueAppCmd() and
|
||||||
|
NormSession::SenderQueueSquelch() where there as two different
|
||||||
|
mis-uses of the NormSession::msg_pool. Thanks to Richard Edell
|
||||||
|
(MITRE) for finding this one.
|
||||||
|
- Fixed problem introduced with new support of multiple "fec_id"
|
||||||
|
types (this version) where receiver processing of NORM_CMD
|
||||||
|
messages with FecPayloadId content (e.g. FLUSH, SQUELCH, etc)
|
||||||
|
_before_ reception of NORM_DATA would result in erroneous
|
||||||
|
messages being generated.
|
||||||
|
Thanks again to Richard Edell (MITRE) for identifying this.
|
||||||
|
- Added optional parameter to NormSetCongestionControl() to allow
|
||||||
|
NORM-CC operation to collect feedback but NOT actually adjust
|
||||||
|
transmission rate. Also added NORM_TX_RATE_CHANGED notification
|
||||||
|
to inform app of when rate change (or suggested change) occurs.
|
||||||
|
- Fixed issue where a small object where INFO was received but no
|
||||||
|
DATA was not causing receiver NACK process to start upon FLUSH
|
||||||
|
receipt as it should. (Thanks to John Unger for finding this!)
|
||||||
|
- Updated JAVA JNI binding code courtesy patches from Kenn Fynn
|
||||||
|
(Dark Corner Software)
|
||||||
|
- Fixed bug where remote sender fec_id value was not cached when
|
||||||
|
only NORM_INFO has been received (thanks to Qingjun Xiao of GSU)
|
||||||
|
- Added NormSetAutoAckingNodes() API call (and underlying code) to
|
||||||
|
allow sender acking node list to be "auto populated" based on
|
||||||
|
hearing any message from a receiver (and/or optionally sender).
|
||||||
|
Also added NormGetNextAckingNode() API call to allow iteration
|
||||||
|
through acking node list to determine status (learn of who is
|
||||||
|
listening, etc). A feature _may_ be added to notify the
|
||||||
|
sender application when new receivers are detected (and added
|
||||||
|
to the list) and maybe even allow per-receiver control of whether
|
||||||
|
an ACK should be solicited or not. I.e., the acking node list would
|
||||||
|
become more of a "tracked" receiver list.
|
||||||
|
- Added enhanced congestion control feature where the receiver always
|
||||||
|
limits the reported rate back to the sender at no more than double
|
||||||
|
the observed receive rate. Adds LIMIT flag to feedback cc flags
|
||||||
|
to facilitate this reporting. This is not part of RFC 5740 but not
|
||||||
|
incompatible with it ... just works a little better. In the future,
|
||||||
|
another way to do this might be to adjust the reported loss value
|
||||||
|
accordingly ... and that would be RFC 5740 compliant although there
|
||||||
|
should be an errata or addendum to the RFC for this.
|
||||||
|
- Added ECN-based congestion control and simple loss-tolerant
|
||||||
|
congestion control options. These will be better documented and
|
||||||
|
perhaps extended in the future.
|
||||||
|
- Added extended precision loss estimate reporting by using "RESERVED"
|
||||||
|
field in CC feedback extension header. Again, non-RFC 5740 but
|
||||||
|
backwards compatible. This helps over large bandwidth-delay links
|
||||||
|
to get to higher data rates. Some more work will be done in this area
|
||||||
|
such as perhaps returning to some form of slow start (exponential increase)
|
||||||
|
behavior after many consecutive RTT with no congestion events. Probably should
|
||||||
|
mirror the return to slow start behavior that occurs when data transmission is
|
||||||
|
idle. This needs to be evaluated as NORM may start being unfairly aggressive
|
||||||
|
in such environments.
|
||||||
|
- This code has the beginnings of an approach to enable automated population
|
||||||
|
of the sender "acking node list"
|
||||||
|
- This code release needs to be more fully documented, but was important
|
||||||
|
to get online since it has _many_ improvements over the prior
|
||||||
|
"stable release"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.4b3
|
Version 1.4b3
|
||||||
=============
|
=============
|
||||||
- Fixed many (hopefully all) cases where NORM_DATA message FLAG_REPAIR
|
- Fixed many (hopefully all) cases where NORM_DATA message FLAG_REPAIR
|
||||||
|
|
@ -21,6 +154,9 @@ Version 1.4b3
|
||||||
- Fixed issue with NormSession::QueueTxObject() where ASSERT() failure
|
- Fixed issue with NormSession::QueueTxObject() where ASSERT() failure
|
||||||
occurred depending upon previous tx object enqueue/dequeue history
|
occurred depending upon previous tx object enqueue/dequeue history
|
||||||
(Thanks to Jeff Bush for finding this one)
|
(Thanks to Jeff Bush for finding this one)
|
||||||
|
- Changed repeated scheduling of receiver remote sender inactivity
|
||||||
|
timer to ensure that busy CPU doesn't result in premature
|
||||||
|
inactivity indication.
|
||||||
- Fixed issue with fix for stream lockup problem from below.
|
- Fixed issue with fix for stream lockup problem from below.
|
||||||
(this is in version 1.4b3a)
|
(this is in version 1.4b3a)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
#ifndef _NORM_ENCODER_RS8
|
|
||||||
#define _NORM_ENCODER_RS8
|
|
||||||
|
|
||||||
#include "protoDebug.h"
|
|
||||||
#include "protoDefs.h" // for UINT16
|
|
||||||
|
|
||||||
// (TBD) We're going to need to have a "NormEncoder" base class and then allow for variants
|
|
||||||
|
|
||||||
class NormEncoder
|
|
||||||
{
|
|
||||||
// Methods
|
|
||||||
public:
|
|
||||||
NormEncoder();
|
|
||||||
~NormEncoder();
|
|
||||||
bool Init(int numData, int numParity, int vectorSize);
|
|
||||||
void Destroy();
|
|
||||||
|
|
||||||
// "Encode" must be called in order of source vector0, vector1, vector2, etc
|
|
||||||
void Encode(unsigned char *dataVector, unsigned char **parityVectorList);
|
|
||||||
int GetNumData() {return ndata;}
|
|
||||||
int GetNumParity() {return npar;}
|
|
||||||
int GetVectorSize() {return vector_size;}
|
|
||||||
|
|
||||||
// Members
|
|
||||||
private:
|
|
||||||
int ndata; // max data pkts per block (k)
|
|
||||||
int npar; // No. of parity packets (n-k)
|
|
||||||
int vector_size; // Size of biggest vector to encode
|
|
||||||
unsigned char* enc_matrix;
|
|
||||||
int enc_index;
|
|
||||||
|
|
||||||
}; // end class NormEncoder
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class NormDecoder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
NormDecoder();
|
|
||||||
~NormDecoder();
|
|
||||||
bool Init(int numData, int numParity, int vectorSize);
|
|
||||||
|
|
||||||
// Note: "erasureLocs" must be in order from lowest to highest!
|
|
||||||
int Decode(unsigned char** vectorList, int ndata, UINT16 erasureCount, UINT16* erasureLocs);
|
|
||||||
int NumParity() {return npar;}
|
|
||||||
int VectorSize() {return vector_size;}
|
|
||||||
void Destroy();
|
|
||||||
|
|
||||||
// Members
|
|
||||||
private:
|
|
||||||
bool InvertDecodingMatrix(); // used in Decode() method
|
|
||||||
|
|
||||||
|
|
||||||
int ndata; // max data pkts per block (k)
|
|
||||||
int npar; // No. of parity packets (n-k)
|
|
||||||
int vector_size; // Size of biggest vector to encode
|
|
||||||
unsigned char* enc_matrix;
|
|
||||||
unsigned char* dec_matrix;
|
|
||||||
int* parity_loc;
|
|
||||||
|
|
||||||
// These "inv_" members are used in InvertDecodingMatrix()
|
|
||||||
int* inv_ndxc;
|
|
||||||
int* inv_ndxr;
|
|
||||||
int* inv_pivt;
|
|
||||||
unsigned char* inv_id_row;
|
|
||||||
unsigned char* inv_temp_row;
|
|
||||||
|
|
||||||
}; // end class NormDecoder
|
|
||||||
|
|
||||||
#endif // _NORM_ENCODER_RS8
|
|
||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Binary file not shown.
File diff suppressed because it is too large
Load Diff
|
|
@ -1,33 +1,65 @@
|
||||||
NORM API Examples
|
================= NORM API Examples =================
|
||||||
=================
|
|
||||||
|
|
||||||
This directory contains some purposely simplified examples of NORM
|
This directory contains some purposely simplified examples of NORM
|
||||||
API usage. See comments in the source code files on how to build
|
API usage. See comments in the source code files on how to build
|
||||||
these on Unix platforms. Eventually, "Makefiles" (and hopefully
|
these on Unix platforms. Eventually, "Makefiles" (and hopefully
|
||||||
"configure" scripts) will be provided as well as Visual C++
|
"waf" configure/build scripts) will be provided as well as Visual
|
||||||
project files for Win32 builds.
|
C++ project files for Win32 builds.
|
||||||
|
|
||||||
The following example programs are included:
|
The following example programs are included:
|
||||||
|
|
||||||
|
(These two programs use a hard-coded multicast address and port,
|
||||||
|
but take a file name and directory name, respectively, as a
|
||||||
|
command-line argument to determine the file sent and the directory
|
||||||
|
to which receive files are stored.)
|
||||||
|
|
||||||
normFileSend.cpp - simple file transmission program. Sends one
|
normFileSend.cpp - simple file transmission program. Sends one
|
||||||
file and exits.
|
file and exits.
|
||||||
|
|
||||||
normFileRecv.cpp - simple file reception program. Receives one
|
normFileRecv.cpp - simple file reception program. Receives one
|
||||||
file and exits.
|
file and exits.
|
||||||
|
|
||||||
(These two programs use a hard-coded multicast address and port,
|
|
||||||
but take a file name and directory name, respectively, as a
|
normDataSend.cpp - simple NORM_OBJECT_DATA transmission program.
|
||||||
command-line argument to determine the file sent and the
|
Sends a series of data objects of random size.
|
||||||
directory to which receive files are stored.)
|
In this example, the NORM_INFO for the objects
|
||||||
|
is set with some text with some "info" about
|
||||||
|
the object.
|
||||||
Other examples will be added later including examples using the
|
|
||||||
"NormGetDescriptor()" function to allow NORM API events to be
|
normDataRecv.cpp - simple NORM_OBJECT_DATA reception program. This
|
||||||
multiplexed with other possible application events (e.g. other I/O
|
receives the data objects that "normDataSend"
|
||||||
or Windows messages, etc).
|
transmits and validates their correctness, in
|
||||||
|
part based on the "info" embedded in the
|
||||||
------------- Brian Adamson <mailto:adamson@itd.nrl.navy.mil> 9
|
NORM_INFO.
|
||||||
June 2005
|
|
||||||
|
java - There is a README.TXT in the java directory.
|
||||||
|
It explains the java examples, how to build
|
||||||
|
them, and how to run them.
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
|
||||||
|
Althought the normDataSend/Recv example use relatively small data
|
||||||
|
object sizes, the _intended_ use of NORM_OBJECT_DATA is for bulkier
|
||||||
|
content stored in application memory space.
|
||||||
|
|
||||||
|
For "messaging" applications that use modestly small message
|
||||||
|
sizes, the NORM_OBJECT_STREAM transport option in NORM is likely
|
||||||
|
to provide more efficient service than NORM_OBJECT_DATA for small
|
||||||
|
objects due to the packet level Forward Error Correction (FEC)
|
||||||
|
based packet recovery mechanism that NORM uses.
|
||||||
|
|
||||||
|
In the future, a similar "simple" example pair will be provided to
|
||||||
|
illustrate the NORM_OBJECT_STREAM form of transport. Meanwhile,
|
||||||
|
the "normTest.cpp" file in the "norm/src/common" directory
|
||||||
|
provides an example of the NORM API calls related to this.
|
||||||
|
|
||||||
|
Other examples will be added later including examples using the
|
||||||
|
"NormGetDescriptor()" function to allow NORM API events to be
|
||||||
|
multiplexed with other possible application events (e.g. other I/O
|
||||||
|
or Windows messages, etc).
|
||||||
|
|
||||||
|
Brian Adamson
|
||||||
|
<mailto:adamson@itd.nrl.navy.mil>
|
||||||
|
20 August 2010
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
import mil.navy.nrl.norm.NormEvent;
|
||||||
|
import mil.navy.nrl.norm.NormFile;
|
||||||
|
import mil.navy.nrl.norm.NormInstance;
|
||||||
|
import mil.navy.nrl.norm.NormNode;
|
||||||
|
import mil.navy.nrl.norm.NormObject;
|
||||||
|
import mil.navy.nrl.norm.NormSession;
|
||||||
|
import mil.navy.nrl.norm.enums.NormEventType;
|
||||||
|
import mil.navy.nrl.norm.enums.NormObjectType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example code to receive a file from the NormFileSend example.
|
||||||
|
*
|
||||||
|
* @author Jason Rush
|
||||||
|
*/
|
||||||
|
public class NormFileRecv {
|
||||||
|
public static void main(String[] args) throws Throwable {
|
||||||
|
if (args.length != 1) {
|
||||||
|
System.err.println("Usage: NormFileRecv <rxCachePath>");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NormInstance instance = new NormInstance();
|
||||||
|
instance.setCacheDirectory(args[0]);
|
||||||
|
|
||||||
|
NormSession session = instance.createSession("224.1.2.3", 6003,
|
||||||
|
NormNode.NORM_NODE_ANY);
|
||||||
|
session.startReceiver(1024 * 1024);
|
||||||
|
|
||||||
|
NormEvent event;
|
||||||
|
while ((event = instance.getNextEvent()) != null) {
|
||||||
|
NormEventType eventType = event.getType();
|
||||||
|
NormObject normObject = event.getObject();
|
||||||
|
|
||||||
|
System.out.println(eventType);
|
||||||
|
|
||||||
|
switch (eventType) {
|
||||||
|
case NORM_RX_OBJECT_INFO:
|
||||||
|
byte[] info = normObject.getInfo();
|
||||||
|
String infoStr = new String(info, "US-ASCII");
|
||||||
|
System.out.println("Info: " + infoStr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_RX_OBJECT_COMPLETED:
|
||||||
|
if (normObject.getType() == NormObjectType.NORM_OBJECT_FILE) {
|
||||||
|
NormFile normFile = (NormFile)normObject;
|
||||||
|
String filename = normFile.getName();
|
||||||
|
|
||||||
|
System.out.println("NormFileObject: " + filename);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
session.stopReceiver();
|
||||||
|
session.destroySession();
|
||||||
|
instance.destroyInstance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
import mil.navy.nrl.norm.NormEvent;
|
||||||
|
import mil.navy.nrl.norm.NormInstance;
|
||||||
|
import mil.navy.nrl.norm.NormNode;
|
||||||
|
import mil.navy.nrl.norm.NormSession;
|
||||||
|
import mil.navy.nrl.norm.enums.NormEventType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example code to send a file to the NormFileRecv example.
|
||||||
|
*
|
||||||
|
* @author Jason Rush
|
||||||
|
*/
|
||||||
|
public class NormFileSend {
|
||||||
|
public static void main(String[] args) throws Throwable {
|
||||||
|
if (args.length != 1) {
|
||||||
|
System.err.println("Usage: NormFileSend <filename>");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NormInstance instance = new NormInstance();
|
||||||
|
|
||||||
|
NormSession session = instance.createSession("224.1.2.3", 6003,
|
||||||
|
NormNode.NORM_NODE_ANY);
|
||||||
|
session.startSender(1, 1024 * 1024, 1400, (short)64, (short)16);
|
||||||
|
|
||||||
|
// Enqueue some data
|
||||||
|
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(1024);
|
||||||
|
session.dataEnqueue(byteBuffer, 0, 1024);
|
||||||
|
|
||||||
|
// Enqueue a file
|
||||||
|
session.fileEnqueue(args[0]);
|
||||||
|
|
||||||
|
NormEvent event;
|
||||||
|
while ((event = instance.getNextEvent()) != null) {
|
||||||
|
NormEventType eventType = event.getType();
|
||||||
|
System.out.println(eventType);
|
||||||
|
}
|
||||||
|
|
||||||
|
session.stopSender();
|
||||||
|
session.destroySession();
|
||||||
|
instance.destroyInstance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,103 @@
|
||||||
|
import mil.navy.nrl.norm.*;
|
||||||
|
import mil.navy.nrl.norm.enums.NormEventType;
|
||||||
|
import mil.navy.nrl.norm.enums.NormObjectType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ... class ...
|
||||||
|
* <p/>
|
||||||
|
* Created by scmijt
|
||||||
|
* Date: Feb 14, 2010
|
||||||
|
* Time: 11:10:50 AM
|
||||||
|
*/
|
||||||
|
public class NormFileSendRecv extends Thread {
|
||||||
|
NormInstance instance;
|
||||||
|
NormSession session;
|
||||||
|
String fileToSend;
|
||||||
|
|
||||||
|
public NormFileSendRecv(String cacheDirectory, String fileToSend) throws Throwable {
|
||||||
|
instance = new NormInstance();
|
||||||
|
instance.setCacheDirectory(cacheDirectory);
|
||||||
|
|
||||||
|
session = instance.createSession("224.1.2.3", 6003,
|
||||||
|
NormNode.NORM_NODE_ANY);
|
||||||
|
session.setLoopback(true);
|
||||||
|
|
||||||
|
this.fileToSend=fileToSend;
|
||||||
|
|
||||||
|
start();
|
||||||
|
|
||||||
|
sendFile();
|
||||||
|
|
||||||
|
session.destroySession();
|
||||||
|
instance.destroyInstance();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
receive();
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
throwable.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void receive() throws Throwable {
|
||||||
|
session.startReceiver(1024 * 1024);
|
||||||
|
NormEvent event;
|
||||||
|
while ((event = instance.getNextEvent()) != null) {
|
||||||
|
NormEventType eventType = event.getType();
|
||||||
|
NormObject normObject = event.getObject();
|
||||||
|
|
||||||
|
System.out.println("NORM: Received something !!!!");
|
||||||
|
|
||||||
|
System.out.println(eventType);
|
||||||
|
|
||||||
|
switch (eventType) {
|
||||||
|
case NORM_RX_OBJECT_INFO:
|
||||||
|
byte[] info = normObject.getInfo();
|
||||||
|
String infoStr = new String(info, "US-ASCII");
|
||||||
|
System.out.println("Info: " + infoStr);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_RX_OBJECT_COMPLETED:
|
||||||
|
if (normObject.getType() == NormObjectType.NORM_OBJECT_FILE) {
|
||||||
|
NormFile normFile = (NormFile)normObject;
|
||||||
|
String filename = normFile.getName();
|
||||||
|
|
||||||
|
System.out.println("NormFileObject: " + filename);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
session.stopReceiver();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendFile() throws Throwable {
|
||||||
|
session.startSender(1, 1024 * 1024, 1400, (short)64, (short)16);
|
||||||
|
|
||||||
|
// Enqueue some data
|
||||||
|
// byte buffer[] = "Hello to the other norm node!!!!!!".getBytes();
|
||||||
|
// session.dataEnqueue(buffer, 0, buffer.length);
|
||||||
|
|
||||||
|
// Enqueue a file
|
||||||
|
session.fileEnqueue(fileToSend);
|
||||||
|
|
||||||
|
NormEvent event;
|
||||||
|
while ((event = instance.getNextEvent()) != null) {
|
||||||
|
NormEventType eventType = event.getType();
|
||||||
|
System.out.println(eventType);
|
||||||
|
}
|
||||||
|
|
||||||
|
session.stopSender();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Throwable {
|
||||||
|
if (args.length != 2) {
|
||||||
|
System.err.println("Usage: NormFileSendRecv <rxCachePath> <sendFile>");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
new NormFileSendRecv(args[0], args[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,109 @@
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import mil.navy.nrl.norm.NormEvent;
|
||||||
|
import mil.navy.nrl.norm.NormInstance;
|
||||||
|
import mil.navy.nrl.norm.NormNode;
|
||||||
|
import mil.navy.nrl.norm.NormObject;
|
||||||
|
import mil.navy.nrl.norm.NormSession;
|
||||||
|
import mil.navy.nrl.norm.NormStream;
|
||||||
|
import mil.navy.nrl.norm.enums.NormEventType;
|
||||||
|
|
||||||
|
public class NormStreamRecv {
|
||||||
|
static final long SESSION_BUFFER_SIZE = 1024 * 1024;
|
||||||
|
static final int SEGMENT_SIZE = 1400;
|
||||||
|
static final int BLOCK_SIZE = 64;
|
||||||
|
static final int PARITY_SEGMENTS = 16;
|
||||||
|
static final String DEST_ADDRESS = "224.1.2.3";
|
||||||
|
static final int DEST_PORT = 6003;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
NormInstance instance = null;
|
||||||
|
NormSession session = null;
|
||||||
|
String destAddress = DEST_ADDRESS;
|
||||||
|
int destPort = DEST_PORT;
|
||||||
|
|
||||||
|
try {
|
||||||
|
int length = 0;
|
||||||
|
int offset = 0;
|
||||||
|
byte[] buf = new byte[65536];
|
||||||
|
boolean useUnicastNACKs = false;
|
||||||
|
|
||||||
|
if (args.length > 0) {
|
||||||
|
// dest addr is arg 1
|
||||||
|
InetAddress mcastAddr = InetAddress.getByName(args[0]);
|
||||||
|
useUnicastNACKs = ! mcastAddr.isMulticastAddress();
|
||||||
|
destAddress = args[0];
|
||||||
|
if (useUnicastNACKs)
|
||||||
|
System.err.println("Using unicast NACKs");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length > 1) {
|
||||||
|
// port is arg 2
|
||||||
|
destPort = Integer.parseInt(args[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
instance = new NormInstance();
|
||||||
|
session = instance.createSession(destAddress, destPort,
|
||||||
|
NormNode.NORM_NODE_ANY);
|
||||||
|
session.setDefaultUnicastNack(useUnicastNACKs);
|
||||||
|
session.startReceiver(SESSION_BUFFER_SIZE);
|
||||||
|
boolean streamIsAlive = true;
|
||||||
|
NormEvent event;
|
||||||
|
|
||||||
|
while ((null != (event = instance.getNextEvent())) && streamIsAlive) {
|
||||||
|
NormEventType eventType = event.getType();
|
||||||
|
NormObject normObject = event.getObject();
|
||||||
|
|
||||||
|
//System.err.println(eventType);
|
||||||
|
|
||||||
|
switch (eventType) {
|
||||||
|
case NORM_RX_OBJECT_NEW:
|
||||||
|
//System.err.println("New stream");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_RX_OBJECT_UPDATED: // Stream updated = data to read ....
|
||||||
|
//System.err.println("An update!");
|
||||||
|
|
||||||
|
if (normObject instanceof NormStream) {
|
||||||
|
int numRead = 0;
|
||||||
|
NormStream normStreamobj;
|
||||||
|
normStreamobj = (NormStream)normObject;
|
||||||
|
// Read as much as possible, writing
|
||||||
|
// everything to System.out.
|
||||||
|
while (0 < (numRead = normStreamobj.read(buf, 0, buf.length))) {
|
||||||
|
if (-1 != numRead) {
|
||||||
|
System.out.write(buf, 0, numRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
System.err.print("Expected NormStream. Got ");
|
||||||
|
System.err.println(normObject);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_RX_OBJECT_COMPLETED:
|
||||||
|
//System.err.println("Stream end");
|
||||||
|
streamIsAlive = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (IOException ex) {
|
||||||
|
System.err.println(ex);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException ex) {
|
||||||
|
System.err.println("Usage: NormStreamRecv [host-name [port]]");
|
||||||
|
System.err.println("Default host-name: " + DEST_ADDRESS);
|
||||||
|
System.err.println("Default port: " + DEST_PORT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null != session) {
|
||||||
|
session.stopReceiver();
|
||||||
|
session.destroySession();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null != instance) {
|
||||||
|
instance.destroyInstance();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
import java.io.IOException;
|
||||||
|
import mil.navy.nrl.norm.NormEvent;
|
||||||
|
import mil.navy.nrl.norm.NormInstance;
|
||||||
|
import mil.navy.nrl.norm.NormNode;
|
||||||
|
import mil.navy.nrl.norm.NormSession;
|
||||||
|
import mil.navy.nrl.norm.NormStream;
|
||||||
|
import mil.navy.nrl.norm.enums.NormEventType;
|
||||||
|
|
||||||
|
public class NormStreamSend {
|
||||||
|
static final long REPAIR_WINDOW_SIZE = 1024 * 1024;
|
||||||
|
static final long SESSION_BUFFER_SIZE = 1024 * 1024;
|
||||||
|
static final int SEGMENT_SIZE = 1400;
|
||||||
|
static final int BLOCK_SIZE = 64;
|
||||||
|
static final int PARITY_SEGMENTS = 16;
|
||||||
|
static final String DEST_ADDRESS = "224.1.2.3";
|
||||||
|
static final int DEST_PORT = 6003;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
NormInstance instance = null;
|
||||||
|
NormSession session = null;
|
||||||
|
NormStream stream = null;
|
||||||
|
String destAddress = DEST_ADDRESS;
|
||||||
|
int destPort = DEST_PORT;
|
||||||
|
|
||||||
|
try {
|
||||||
|
int length = 0;
|
||||||
|
int offset = 0;
|
||||||
|
byte[] buf = new byte[65536];
|
||||||
|
|
||||||
|
if (args.length > 0) {
|
||||||
|
destAddress = args[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.length > 1) {
|
||||||
|
destPort = Integer.parseInt(args[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
instance = new NormInstance();
|
||||||
|
session = instance.createSession(destAddress, destPort,
|
||||||
|
NormNode.NORM_NODE_ANY);
|
||||||
|
|
||||||
|
String ccStr = System.getProperty("Norm.CC", "off");
|
||||||
|
if (ccStr.equalsIgnoreCase("on")) {
|
||||||
|
session.setCongestionControl(true, true);
|
||||||
|
System.out.println("Set Congestion Control to " + ccStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
session.startSender(1, SESSION_BUFFER_SIZE,
|
||||||
|
SEGMENT_SIZE, BLOCK_SIZE, PARITY_SEGMENTS);
|
||||||
|
stream = session.streamOpen(REPAIR_WINDOW_SIZE);
|
||||||
|
|
||||||
|
while (-1 != (length = System.in.read(buf, 0, buf.length))) {
|
||||||
|
int numWritten = 0;
|
||||||
|
offset = 0;
|
||||||
|
|
||||||
|
while (length != (numWritten = stream.write(buf, offset, length))) {
|
||||||
|
length -= numWritten;
|
||||||
|
offset += numWritten;
|
||||||
|
|
||||||
|
NormEvent event = instance.getNextEvent();
|
||||||
|
NormEventType eventType = event.getType();
|
||||||
|
|
||||||
|
while ((eventType != NormEventType.NORM_TX_QUEUE_EMPTY) &&
|
||||||
|
(eventType != NormEventType.NORM_TX_QUEUE_VACANCY)) {
|
||||||
|
event = instance.getNextEvent();
|
||||||
|
eventType = event.getType();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.markEom();
|
||||||
|
|
||||||
|
//System.err.println("Wrote " + numWritten);
|
||||||
|
//System.err.println("... Done!");
|
||||||
|
|
||||||
|
// TODO: Create a new buf each time I'm successful writing
|
||||||
|
// all of it?
|
||||||
|
}
|
||||||
|
|
||||||
|
stream.flush();
|
||||||
|
System.err.println("End of file!");
|
||||||
|
}
|
||||||
|
catch (IOException ex) {
|
||||||
|
System.err.println(ex);
|
||||||
|
}
|
||||||
|
catch (NumberFormatException ex) {
|
||||||
|
System.err.println("Usage: NormStreamSend [host-name [port]]");
|
||||||
|
System.err.println("Default host-name: " + DEST_ADDRESS);
|
||||||
|
System.err.println("Default port: " + DEST_PORT);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null != stream) {
|
||||||
|
System.err.println("Closing stream");
|
||||||
|
stream.close(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null != session) {
|
||||||
|
System.err.println("Stopping sender");
|
||||||
|
session.stopSender();
|
||||||
|
System.err.println("Destroying session");
|
||||||
|
session.destroySession();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null != instance) {
|
||||||
|
System.err.println("Destroying instance");
|
||||||
|
instance.destroyInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
System.err.println("That's all folks!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
================= NORM Java API Examples =================
|
||||||
|
|
||||||
|
This directory contains some purposely simplified examples of NORM
|
||||||
|
Java API usage. See comments below on how to build and run these on
|
||||||
|
Unix platforms. Eventually, "build.xml" will be provided.
|
||||||
|
|
||||||
|
|
||||||
|
The following example programs are included:
|
||||||
|
|
||||||
|
(These two programs use a hard-coded multicast address and port,
|
||||||
|
but take a file name and directory name, respectively, as a
|
||||||
|
command-line argument to determine the file sent and the directory
|
||||||
|
to which receive files are stored.)
|
||||||
|
|
||||||
|
NormFileSend.java - simple file transmission program. Sends one
|
||||||
|
file. The address is 224.1.2.3:6003.
|
||||||
|
|
||||||
|
NormFileRecv.java - simple file reception program. Receives one
|
||||||
|
file. The address is 224.1.2.3:6003.
|
||||||
|
|
||||||
|
NormFileSendRecv.java - One application that sends a file to itself.
|
||||||
|
The address is 224.1.2.3:6003.
|
||||||
|
|
||||||
|
NormStreamSend.java - This is an example of writing to a NORM stream.
|
||||||
|
It reads from STDIN and writes to the
|
||||||
|
stream. Specify the stream address on the command
|
||||||
|
line or use the default address, 224.1.2.3:6003.
|
||||||
|
Enable congestion control by setting the Java
|
||||||
|
system property Norm.CC to "on"
|
||||||
|
(i.e. -DNorm.CC=on).
|
||||||
|
|
||||||
|
NormStreamRecv.java - This is an example of reading from a NORM
|
||||||
|
stream. It writes to STDOUT and writes from the
|
||||||
|
stream. Specify the stream address on the command
|
||||||
|
line or use the default address, 224.1.2.3:6003.
|
||||||
|
|
||||||
|
|
||||||
|
COMPILING THE Java API EXAMPLES
|
||||||
|
|
||||||
|
After you build the JNI and the Norm Java jar file, you can compile
|
||||||
|
the examples in this directory all at one go:
|
||||||
|
|
||||||
|
javac -cp ../../lib/norm-1.0.0.jar *.java
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
RUNNING THE Java API EXAMPLES
|
||||||
|
|
||||||
|
You can use the shell scripts supplied to run the similarly named
|
||||||
|
example programs.
|
||||||
|
|
||||||
|
filesend.sh - Run NormFileSend
|
||||||
|
filerecv.sh - Run NormFileRecv
|
||||||
|
streamsend.sh - Run NormStreamSend
|
||||||
|
streamrecv.sh - Run NormStreamRecv
|
||||||
|
|
||||||
|
Alternatively, you can run any example program by invoking java. You
|
||||||
|
must define the system property java.library.path and set the
|
||||||
|
classpath so that java can find the norm jar file as well as the local
|
||||||
|
classes. For example, to run NormStreamSend:
|
||||||
|
|
||||||
|
java -Djava.library.path=../../lib -cp .:../../lib/norm-1.0.0.jar NormStreamSend
|
||||||
|
|
||||||
|
NOTE ABOUT NormStreamSend
|
||||||
|
|
||||||
|
NormStreamSend supports NORM's TCP-friendly congestion control.
|
||||||
|
Enable that by setting the system property Norm.CC to "on". You can
|
||||||
|
do that in streamsend.sh or you can do that on the command line:
|
||||||
|
|
||||||
|
java -DNorm.CC=on -Djava.library.path=../../lib -cp .:../../lib/norm-1.0.0.jar NormStreamSend
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
java -Djava.library.path=../../lib -cp .:../../lib/norm-1.0.0.jar NormFileRecv $@
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
java -Djava.library.path=../../lib -cp .:../../lib/norm-1.0.0.jar NormFileSend $@
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/bash
|
||||||
|
java -Djava.library.path=../../lib -cp .:../../lib/norm-1.0.0.jar NormStreamRecv $@
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Enable TCP-friendly congestion control with:
|
||||||
|
# -DNorm.CC=on
|
||||||
|
java -Djava.library.path=../../lib -cp .:../../lib/norm-1.0.0.jar NormStreamSend $@
|
||||||
|
|
@ -0,0 +1,119 @@
|
||||||
|
// This example uses the NORM API and demonstrates the use
|
||||||
|
// of NORM_OBJECT_DATA transmission and reception.
|
||||||
|
// The "data" sent and received are simple text messages
|
||||||
|
// of randomly-varying length.
|
||||||
|
|
||||||
|
XXXX - THIS CODE IS NOT YET COMPLETE !!!!!
|
||||||
|
|
||||||
|
#include <normApi.h>
|
||||||
|
|
||||||
|
// We use some "protolib" functions for
|
||||||
|
// cross-platform portability
|
||||||
|
#include <protoDebug.h>
|
||||||
|
#include <protoTime.h>
|
||||||
|
|
||||||
|
void Usage()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: normDataExample [send][recv]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
bool send = false;
|
||||||
|
bool recv = false;
|
||||||
|
// Parse any command-line arguments
|
||||||
|
int i = 1;
|
||||||
|
while (i < argc)
|
||||||
|
{
|
||||||
|
if (!strcmp("send", argv[i]))
|
||||||
|
{
|
||||||
|
send = true;
|
||||||
|
}
|
||||||
|
else if (!strcmp("recv", argv[i]))
|
||||||
|
{
|
||||||
|
recv = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataExample error: invalid command-line option!\n");
|
||||||
|
Usage();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!send && !recv)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataExample error: not configured as sender or receiver!\n");
|
||||||
|
Usage();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 1) Create a NORM API "NormInstance"
|
||||||
|
NormInstanceHandle instance = NormCreateInstance();
|
||||||
|
if (NORM_INSTANCE_INVALID == instance)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataExample error: NormCreateInstance() failure!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 2) Create a NormSession using default "automatic" local node id
|
||||||
|
NormSessionHandle session = NormCreateSession(instance,
|
||||||
|
"224.1.2.3",
|
||||||
|
6003,
|
||||||
|
NORM_NODE_ANY);
|
||||||
|
if (NORM_SESSION_INVALID == instance)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataExample error: NormCreateSession() failure!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable some debugging output here
|
||||||
|
//SetDebugLevel(2);
|
||||||
|
// Uncomment to turn on debug NORM message tracing
|
||||||
|
NormSetMessageTrace(session, true);
|
||||||
|
|
||||||
|
// 3) Start receiver operation, if applicable
|
||||||
|
if (recv)
|
||||||
|
{
|
||||||
|
// Start receiver w/ 1MByte buffer per sender
|
||||||
|
if (!NormStartReceiver(session, 1024*1024))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataExample error: NormStartReceiver() failure!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4) Start receiver operation, if applicable
|
||||||
|
if (send)
|
||||||
|
{
|
||||||
|
// a) Pick a random sender "sessionId"
|
||||||
|
// (seed the random generation so we get a new one each time)
|
||||||
|
struct timeval currentTime;
|
||||||
|
ProtoSystemTime(currentTime);
|
||||||
|
srand(currentTime.tv_sec); // seed random number generator
|
||||||
|
NormSessionId sessionId = (NormSessionId)rand();
|
||||||
|
|
||||||
|
// b) Set sender rate or congestion control operation
|
||||||
|
NormSetTxRate(session, 256.0e+03); // in bits/second
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enter loop waiting for and handling NormEvents ...
|
||||||
|
// (We illustrate usage of a NormDescriptor for this
|
||||||
|
// with our WaitForNormEvent() routine.)
|
||||||
|
// When set to "send" the "interval" is used to
|
||||||
|
NormDescriptor normDescriptor = NormGetDescriptor(instance);
|
||||||
|
bool keepGoing = true;
|
||||||
|
while (keepGoing)
|
||||||
|
{
|
||||||
|
boolWaitForNormEvent(normDescriptor, timeDelay)
|
||||||
|
} // end while (keepGoing)
|
||||||
|
|
||||||
|
|
||||||
|
} // end main()
|
||||||
|
|
@ -0,0 +1,248 @@
|
||||||
|
/******************************************************************************
|
||||||
|
Simple NORM_OBJECT_DATA receiver example app using the NORM API
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
|
||||||
|
normDataRecv
|
||||||
|
|
||||||
|
BUILD (Unix):
|
||||||
|
|
||||||
|
g++ -o normDataRecv normDataRecv.cpp -D_FILE_OFFSET_BITS=64 -I../include/ \
|
||||||
|
../lib/libnorm.a ../protolib/lib/libProtokit.a \
|
||||||
|
-lpthread
|
||||||
|
|
||||||
|
(for MacOS/BSD, add "-lresolv")
|
||||||
|
(for Solaris, add "-lnsl -lsocket -lresolv")
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
// Notes:
|
||||||
|
// 1) The program exits once a single file has been received ...
|
||||||
|
// 2) The received file is written to the <rxCacheDirectory>
|
||||||
|
// 3) The program also will exit on <CTRL-C> from user
|
||||||
|
// 4) "normDataRecv" should be started before "normFileSend"
|
||||||
|
|
||||||
|
#include "normApi.h" // for NORM API
|
||||||
|
|
||||||
|
#include "normMessage.h"
|
||||||
|
|
||||||
|
#include "protoAddress.h" // for ProtoAddress for easy mcast test
|
||||||
|
|
||||||
|
#include <stdio.h> // for printf(), etc
|
||||||
|
#include <stdlib.h> // for srand()
|
||||||
|
#include <string.h> // for strrchr()
|
||||||
|
#include <sys/time.h> // for gettimeofday()
|
||||||
|
|
||||||
|
|
||||||
|
// Usage: normDataRecv [addr <addr>/<port>]
|
||||||
|
|
||||||
|
|
||||||
|
#include "protoBitmask.h"
|
||||||
|
|
||||||
|
void Usage()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: normDataRecv [addr <addr>/<port>]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
// Initialize default parameters.
|
||||||
|
char sessionAddr[256];
|
||||||
|
strcpy(sessionAddr, "224.1.2.3");
|
||||||
|
UINT16 sessionPort = 6003;
|
||||||
|
|
||||||
|
// Parse command-line for any parameters
|
||||||
|
int i = 1;
|
||||||
|
while (i < argc)
|
||||||
|
{
|
||||||
|
if (0 == strcmp("addr", argv[1]))
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
if (i == argc)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataRecv error: missing \"addr\" arguments\n");
|
||||||
|
Usage();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
strcpy(sessionAddr, argv[i++]);
|
||||||
|
char* ptr = strchr(sessionAddr, '/');
|
||||||
|
if (NULL != ptr)
|
||||||
|
{
|
||||||
|
*ptr = '\0';
|
||||||
|
sessionPort = atoi(ptr+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataRecv error: invalid command \"%s\"\n", argv[i]);
|
||||||
|
Usage();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1) Create a NORM API "NormInstance"
|
||||||
|
NormInstanceHandle instance = NormCreateInstance();
|
||||||
|
|
||||||
|
// 2) Create a NormSession using default "automatic" local node id
|
||||||
|
NormSessionHandle session = NormCreateSession(instance,
|
||||||
|
sessionAddr,
|
||||||
|
sessionPort,
|
||||||
|
NORM_NODE_ANY);
|
||||||
|
|
||||||
|
|
||||||
|
// NOTE: These are debugging routines available
|
||||||
|
// (not necessary for normal app use)
|
||||||
|
NormSetDebugLevel(3);
|
||||||
|
// Uncomment to turn on debug NORM message tracing
|
||||||
|
//NormSetMessageTrace(session, true);
|
||||||
|
// Uncomment to turn on some random packet loss for testing
|
||||||
|
//NormSetRxLoss(session, 10.0); // 10% packet loss
|
||||||
|
struct timeval currentTime;
|
||||||
|
gettimeofday(¤tTime, NULL);
|
||||||
|
// Uncomment to get different packet loss patterns from run to run
|
||||||
|
srand(currentTime.tv_sec); // seed random number generator
|
||||||
|
|
||||||
|
// Uncomment if unicast NACKing is desired
|
||||||
|
// (We "cheat" here and use the Protolib "ProtoAddress" class
|
||||||
|
// that NORM happens to use under the hood as well)
|
||||||
|
ProtoAddress theAddr;
|
||||||
|
theAddr.ResolveFromString(sessionAddr);
|
||||||
|
if (!theAddr.IsMulticast())
|
||||||
|
{
|
||||||
|
NormSetDefaultUnicastNack(session, true);
|
||||||
|
// Set the tx port equal to session port so sender socket
|
||||||
|
// and make it "connected" to the remote sender address (sessionAddr) and port (sessionPort+1)
|
||||||
|
// (This assumes the remote sender address/port is known (sessionAddr/sessionPort+1 in this case)
|
||||||
|
NormSetTxPort(session, sessionPort);
|
||||||
|
NormSetRxPortReuse(session, true, NULL, sessionAddr, sessionPort+1);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Uncomment to allow multiple NORM processes on same session port number
|
||||||
|
//NormSetRxPortReuse(session, true, sessionAddr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3) Start the receiver with 1 Mbyte buffer per sender
|
||||||
|
NormStartReceiver(session, 1024*1024);
|
||||||
|
|
||||||
|
struct timeval startTime, endTime; // to measure object transfer time
|
||||||
|
|
||||||
|
// 4) Enter NORM event loop
|
||||||
|
bool keepGoing = true;
|
||||||
|
while (keepGoing)
|
||||||
|
{
|
||||||
|
NormEvent theEvent;
|
||||||
|
if (!NormGetNextEvent(instance, &theEvent)) continue;
|
||||||
|
switch (theEvent.type)
|
||||||
|
{
|
||||||
|
case NORM_RX_OBJECT_NEW:
|
||||||
|
gettimeofday(&startTime, NULL);
|
||||||
|
fprintf(stderr, "normDataRecv: NORM_RX_OBJECT_NEW event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_RX_OBJECT_INFO:
|
||||||
|
// Assume info contains '/' delimited <path/fileName> string
|
||||||
|
//fprintf(stderr, "normDataRecv: NORM_RX_OBJECT_INFO event ...\n");
|
||||||
|
if (NORM_OBJECT_DATA == NormObjectGetType(theEvent.object))
|
||||||
|
{
|
||||||
|
char dataInfo[8192];
|
||||||
|
unsigned int nameLen = NormObjectGetInfo(theEvent.object, dataInfo, 8191);
|
||||||
|
dataInfo[nameLen] = '\0';
|
||||||
|
//fprintf(stderr, "normDataRecv: info = \"%s\"\n", dataInfo);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_RX_OBJECT_UPDATED:
|
||||||
|
{
|
||||||
|
//fprintf(stderr, "normDataRecv: NORM_RX_OBJECT_UPDATE event ...\n");
|
||||||
|
// Uncomment this stuff to monitor file receive progress
|
||||||
|
// (At high packet rates, you may want to be careful here and
|
||||||
|
// only calculate/post updates occasionally rather than for
|
||||||
|
// each and every RX_OBJECT_UPDATE event)
|
||||||
|
//NormSize objectSize = NormObjectGetSize(theEvent.object);
|
||||||
|
//NormSize completed = objectSize - NormObjectGetBytesPending(theEvent.object);
|
||||||
|
//double percentComplete = 100.0 * ((double)completed/(double)objectSize);
|
||||||
|
//fprintf(stderr, "normDataRecv: object>%p completion status %lu/%lu (%3.0lf%%)\n",
|
||||||
|
// theEvent.object, (unsigned long)completed, (unsigned long)objectSize, percentComplete);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case NORM_RX_OBJECT_COMPLETED:
|
||||||
|
{
|
||||||
|
gettimeofday(&endTime, NULL);
|
||||||
|
fprintf(stderr, "normDataRecv: NORM_RX_OBJECT_COMPLETED event ...\n");
|
||||||
|
unsigned int objSize = NormObjectGetSize(theEvent.object);
|
||||||
|
const char* dataPtr = NormDataAccessData(theEvent.object);
|
||||||
|
// Validate that the data is complete/accurate
|
||||||
|
// a) compare data size against the size embedded in the "INFO"
|
||||||
|
char dataInfo[8192];
|
||||||
|
unsigned int nameLen = NormObjectGetInfo(theEvent.object, dataInfo, 8191);
|
||||||
|
dataInfo[nameLen] = '\0';
|
||||||
|
unsigned int dataCount, dataLen;
|
||||||
|
if (2 != sscanf(dataInfo, "NORM_OBJECT_DATA count>%u size>%u", &dataCount, &dataLen))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataRecv error: received NORM_OBJECT_DATA with invalid INFO?!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (objSize != dataLen)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataRecv error: received NORM_OBJECT_DATA with bad object size?!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
// b) check the data content
|
||||||
|
char data = *dataPtr;
|
||||||
|
for (unsigned int i = 0; i < dataLen; i++)
|
||||||
|
{
|
||||||
|
if (dataPtr[i] != data)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataRecv error: received bad NORM_OBJECT_DATA!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
double transferTime = endTime.tv_sec - startTime.tv_sec;
|
||||||
|
if (endTime.tv_usec > startTime.tv_usec)
|
||||||
|
transferTime += 1.0e-06 * (double)(endTime.tv_usec - startTime.tv_usec);
|
||||||
|
else
|
||||||
|
transferTime -= 1.0e-06 * (double)(startTime.tv_usec - endTime.tv_usec);
|
||||||
|
double transferRate = (8.0/1000.0) * (double)objSize / transferTime;
|
||||||
|
fprintf(stderr, "normDataRecv: transfer duration %lf sec at %lf kbps\n", transferTime, transferRate);
|
||||||
|
//fprintf(stderr, "normDataRecv: object>%p count>%d size>%u data>%.64s ...\n",
|
||||||
|
// theEvent.object, dataCount, objSize, dataPtr);
|
||||||
|
// NOTE: Since we did not "retain" or "detach data" from this
|
||||||
|
// received data object, it (and its data) will be deleted upon
|
||||||
|
// the next call to "NormGetNextEvent()".
|
||||||
|
//keepGoing = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NORM_RX_OBJECT_ABORTED:
|
||||||
|
fprintf(stderr, "normDataRecv: NORM_RX_OBJECT_ABORTED event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_REMOTE_SENDER_NEW:
|
||||||
|
fprintf(stderr, "normDataRecv: NORM_REMOTE_SENDER_NEW event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_REMOTE_SENDER_ACTIVE:
|
||||||
|
fprintf(stderr, "normDataRecv: NORM_REMOTE_SENDER_ACTIVE event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_REMOTE_SENDER_INACTIVE:
|
||||||
|
fprintf(stderr, "normDataRecv: NORM_REMOTE_SENDER_INACTIVE event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
//fprintf(stderr, "normDataRecv: Got event type: %d\n", theEvent.type);
|
||||||
|
break;
|
||||||
|
} // end switch(theEvent.type)
|
||||||
|
}
|
||||||
|
NormStopReceiver(session);
|
||||||
|
NormDestroySession(session);
|
||||||
|
NormDestroyInstance(instance);
|
||||||
|
|
||||||
|
fprintf(stderr, "normDataRecv: Done.\n");
|
||||||
|
return 0;
|
||||||
|
} // end main()
|
||||||
|
|
@ -0,0 +1,227 @@
|
||||||
|
/******************************************************************************
|
||||||
|
Simple NORM_OBJECT_DATA sender example app using the NORM API
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
|
||||||
|
normSendData
|
||||||
|
|
||||||
|
BUILD (Unix):
|
||||||
|
|
||||||
|
g++ -o normDataSend normDataSend.cpp -D_FILE_OFFSET_BITS=64 -I../common/ \
|
||||||
|
-I../protolib/include ../lib/libnorm.a ../protolib/lib/libProtokit.a \
|
||||||
|
-lpthread
|
||||||
|
|
||||||
|
(for MacOS/BSD, add "-lresolv")
|
||||||
|
(for Solaris, add "-lnsl -lsocket -lresolv")
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
// Notes:
|
||||||
|
// 1) A single file is sent.
|
||||||
|
// 2) The program exits upon NORM_TX_FLUSH_COMPLETED notification (or user <CTRL-C>)
|
||||||
|
// 3) NORM receiver should be started first (before sender starts)
|
||||||
|
|
||||||
|
|
||||||
|
#include "normApi.h" // for NORM API
|
||||||
|
|
||||||
|
#include "protoDefs.h" // for ProtoSystemTime()
|
||||||
|
#include "protoDebug.h" // for SetDebugLevel(), etc
|
||||||
|
#include "protoAddress.h" // for ProtoAddress for easy mcast test
|
||||||
|
|
||||||
|
#include <stdio.h> // for printf(), etc
|
||||||
|
#include <stdlib.h> // for srand()
|
||||||
|
#include <string.h> // for strrchr()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Usage: normDataSend [addr <addr>/<port>]
|
||||||
|
|
||||||
|
void Usage()
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Usage: normDataSend [addr <addr>/<port>]\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
// Initialize default parameters.
|
||||||
|
char sessionAddr[256];
|
||||||
|
strcpy(sessionAddr, "224.1.2.3");
|
||||||
|
UINT16 sessionPort = 6003;
|
||||||
|
|
||||||
|
// Parse command-line for any parameters
|
||||||
|
int i = 1;
|
||||||
|
while (i < argc)
|
||||||
|
{
|
||||||
|
if (0 == strcmp("addr", argv[1]))
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
if (i == argc)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataSend error: missing \"addr\" arguments\n");
|
||||||
|
Usage();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
strcpy(sessionAddr, argv[i++]);
|
||||||
|
char* ptr = strchr(sessionAddr, '/');
|
||||||
|
if (NULL != ptr)
|
||||||
|
{
|
||||||
|
*ptr = '\0';
|
||||||
|
sessionPort = atoi(ptr+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normDataSend error: invalid command \"%s\"\n", argv[i]);
|
||||||
|
Usage();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is the session an mcast addr?
|
||||||
|
ProtoAddress theAddr;
|
||||||
|
theAddr.ResolveFromString(sessionAddr);
|
||||||
|
bool isMulticastSession = theAddr.IsMulticast();
|
||||||
|
|
||||||
|
|
||||||
|
// 1) Create a NORM API "NormInstance"
|
||||||
|
NormInstanceHandle instance = NormCreateInstance();
|
||||||
|
|
||||||
|
// 2) Create a NormSession using default "automatic" local node id
|
||||||
|
NormSessionHandle session = NormCreateSession(instance,
|
||||||
|
sessionAddr,
|
||||||
|
sessionPort,
|
||||||
|
NORM_NODE_ANY);
|
||||||
|
|
||||||
|
// NOTE: These are some debugging routines available
|
||||||
|
// (not necessary for normal app use)
|
||||||
|
NormSetDebugLevel(3);
|
||||||
|
// Uncomment to turn on debug NORM message tracing
|
||||||
|
//NormSetMessageTrace(session, true);
|
||||||
|
// Uncomment to turn on some random packet loss
|
||||||
|
//NormSetTxLoss(session, 10.0); // 10% packet loss
|
||||||
|
struct timeval currentTime;
|
||||||
|
ProtoSystemTime(currentTime);
|
||||||
|
// Uncomment to get different packet loss patterns from run to run
|
||||||
|
// (and a different sender sessionId)
|
||||||
|
srand(currentTime.tv_sec); // seed random number generator
|
||||||
|
|
||||||
|
// 3) Set transmission rate
|
||||||
|
NormSetTxRate(session, 2.0e+06); // in bits/second
|
||||||
|
|
||||||
|
// Uncomment to enable TCP-friendly congestion control
|
||||||
|
//NormSetCongestionControl(session, true);
|
||||||
|
|
||||||
|
// Uncomment to use a _specific_ transmit port number
|
||||||
|
// (Can be the same as session port (rx port), but this
|
||||||
|
// is _not_ recommended for mcast sessions when unicast feedback may be
|
||||||
|
// possible! - must be called _before_ NormStartSender())
|
||||||
|
if (!isMulticastSession)
|
||||||
|
{
|
||||||
|
NormSetTxPort(session, sessionPort+1, true);
|
||||||
|
|
||||||
|
// Uncomment to set the session to only open
|
||||||
|
// a single socket for transmission.
|
||||||
|
// This also "connects" the sender to session (receiver) addr/port
|
||||||
|
// (unicast nacking _and_ "txPort == rxPort" MUST be used by receivers)
|
||||||
|
NormSetTxOnly(session, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uncomment to allow multiple NORM processes on same session port number
|
||||||
|
// Note that port reuse only works well for mcast.
|
||||||
|
// if (isMulticastSession) NormSetRxPortReuse(session, true);
|
||||||
|
|
||||||
|
// 4) Start the sender using a random "sessionId"
|
||||||
|
NormSessionId sessionId = (NormSessionId)rand();
|
||||||
|
TRACE("starting NORM sender ...\n");
|
||||||
|
NormStartSender(session, sessionId, 1024*1024, 1400, 64, 16);
|
||||||
|
|
||||||
|
// Uncomment to set large tx socket buffer size
|
||||||
|
// (might be needed for high rate sessions)
|
||||||
|
//NormSetTxSocketBuffer(session, 512000);
|
||||||
|
|
||||||
|
|
||||||
|
// 5) Enqueue the first data message
|
||||||
|
// (we enqueue text strings of random length as object content)
|
||||||
|
unsigned int MAX_COUNT = 1; // number of objects to send, zero means unlimited
|
||||||
|
const int MIN_LENGTH = 460000; // min object size (in bytes)
|
||||||
|
const int MAX_LENGTH = 460000; // max object size (in bytes)
|
||||||
|
|
||||||
|
unsigned int dataCount = 0;
|
||||||
|
int dataLen = MIN_LENGTH + rand() % (MAX_LENGTH - MIN_LENGTH + 1);
|
||||||
|
char* dataMsg = new char[dataLen];
|
||||||
|
ASSERT(NULL != dataMsg);
|
||||||
|
char data = 'a';
|
||||||
|
memset(dataMsg, data, dataLen); // set message content with 'dummy' data
|
||||||
|
// Provide some "info" about this message
|
||||||
|
char dataInfo[256];
|
||||||
|
sprintf(dataInfo, "NORM_OBJECT_DATA count>%d size>%d", dataCount, dataLen);
|
||||||
|
// Enqueue the data object
|
||||||
|
NormObjectHandle dataObj =
|
||||||
|
NormDataEnqueue(session, dataMsg, dataLen, dataInfo, strlen(dataInfo));
|
||||||
|
ASSERT(NORM_OBJECT_INVALID != dataObj);
|
||||||
|
dataCount++;
|
||||||
|
|
||||||
|
// 6) Enter NORM event loop
|
||||||
|
bool keepGoing = true;
|
||||||
|
while (keepGoing)
|
||||||
|
{
|
||||||
|
NormEvent theEvent;
|
||||||
|
if (!NormGetNextEvent(instance, &theEvent)) continue;
|
||||||
|
switch (theEvent.type)
|
||||||
|
{
|
||||||
|
case NORM_TX_QUEUE_VACANCY:
|
||||||
|
//fprintf(stderr, "normDataSend: NORM_TX_QUEUE_VACANCY event...\n");
|
||||||
|
break;
|
||||||
|
case NORM_TX_QUEUE_EMPTY:
|
||||||
|
{
|
||||||
|
if ((0 == MAX_COUNT) || (dataCount < MAX_COUNT))
|
||||||
|
{
|
||||||
|
// Enqueue another data object when norm tx queue goes empty
|
||||||
|
//fprintf(stderr, "normDataSend: NORM_TX_QUEUE_EMPTY event...\n");
|
||||||
|
dataLen = MIN_LENGTH + rand() % (MAX_LENGTH - MIN_LENGTH + 1);
|
||||||
|
dataMsg = new char[dataLen];
|
||||||
|
ASSERT(NULL != dataMsg);
|
||||||
|
memset(dataMsg, data, dataLen);
|
||||||
|
sprintf(dataInfo, "NORM_OBJECT_DATA count>%d size>%d data>%.64s ...", dataCount, dataLen, dataMsg);
|
||||||
|
NormObjectHandle dataObj =
|
||||||
|
NormDataEnqueue(session, dataMsg, dataLen, dataInfo, strlen(dataInfo));
|
||||||
|
// Note that flow control timer may have prevented NormDataEnqueue()
|
||||||
|
// from succeeding even though we got a NORM_TX_QUEUE_EMPTY notification
|
||||||
|
// (The underlying NORM code could be tightened up a bit here!)
|
||||||
|
if (NORM_OBJECT_INVALID != dataObj)
|
||||||
|
{
|
||||||
|
dataCount++;
|
||||||
|
if (++data > 'z') data = 'a';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TRACE("normDataSend: FLOW CONTROL CONDITION?\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NORM_TX_OBJECT_PURGED:
|
||||||
|
{
|
||||||
|
//fprintf(stderr, "normDataSend: NORM_TX_OBJECT_PURGED event ...\n");
|
||||||
|
char* dataPtr = NormDataDetachData(theEvent.object);
|
||||||
|
delete[] dataPtr;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NORM_TX_FLUSH_COMPLETED:
|
||||||
|
fprintf(stderr, "normDataSend: NORM_TX_FLUSH_COMPLETED event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
//TRACE("normDataSend: Got event type: %d\n", theEvent.type);
|
||||||
|
break;
|
||||||
|
} // end switch(theEvent.type)
|
||||||
|
} // end while (NormGetNextEvent())
|
||||||
|
|
||||||
|
NormStopSender(session);
|
||||||
|
NormDestroySession(session);
|
||||||
|
NormDestroyInstance(instance);
|
||||||
|
|
||||||
|
fprintf(stderr, "normDataSend: Done.\n");
|
||||||
|
return 0;
|
||||||
|
} // end main()
|
||||||
|
|
@ -7,9 +7,9 @@
|
||||||
|
|
||||||
BUILD (Unix):
|
BUILD (Unix):
|
||||||
|
|
||||||
g++ -o normFileRecv normFileRecv.cpp -D_FILE_OFFSET_BITS=64 -DPROTO_DEBUG \
|
g++ -o normFileRecv normFileRecv.cpp -D_FILE_OFFSET_BITS=64 -I../common/ \
|
||||||
-I../common/ -I../protolib/common ../unix/libnorm.a \
|
-I../protolib/include ../lib/libnorm.a ../protolib/lib/libProtokit.a \
|
||||||
../protolib/unix/libProtokit.a -lpthread
|
-lpthread
|
||||||
|
|
||||||
(for MacOS/BSD, add "-lresolv")
|
(for MacOS/BSD, add "-lresolv")
|
||||||
(for Solaris, add "-lnsl -lsocket -lresolv")
|
(for Solaris, add "-lnsl -lsocket -lresolv")
|
||||||
|
|
@ -65,7 +65,7 @@ int main(int argc, char* argv[])
|
||||||
// Uncomment to turn on debug NORM message tracing
|
// Uncomment to turn on debug NORM message tracing
|
||||||
//NormSetMessageTrace(session, true);
|
//NormSetMessageTrace(session, true);
|
||||||
// Uncomment to turn on some random packet loss for testing
|
// Uncomment to turn on some random packet loss for testing
|
||||||
//NormSetRxLoss(session, 10.0); // 10% packet loss
|
NormSetRxLoss(session, 10.0); // 10% packet loss
|
||||||
struct timeval currentTime;
|
struct timeval currentTime;
|
||||||
ProtoSystemTime(currentTime);
|
ProtoSystemTime(currentTime);
|
||||||
// Uncomment to get different packet loss patterns from run to run
|
// Uncomment to get different packet loss patterns from run to run
|
||||||
|
|
@ -83,9 +83,10 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
// 5) Enter NORM event loop
|
// 5) Enter NORM event loop
|
||||||
bool keepGoing = true;
|
bool keepGoing = true;
|
||||||
NormEvent theEvent;
|
while (keepGoing)
|
||||||
while (keepGoing && NormGetNextEvent(instance, &theEvent))
|
|
||||||
{
|
{
|
||||||
|
NormEvent theEvent;
|
||||||
|
if (!NormGetNextEvent(instance, &theEvent)) continue;
|
||||||
switch (theEvent.type)
|
switch (theEvent.type)
|
||||||
{
|
{
|
||||||
case NORM_RX_OBJECT_NEW:
|
case NORM_RX_OBJECT_NEW:
|
||||||
|
|
@ -127,7 +128,7 @@ int main(int argc, char* argv[])
|
||||||
// only calculate/post updates occasionally rather than for
|
// only calculate/post updates occasionally rather than for
|
||||||
// each and every RX_OBJECT_UPDATE event)
|
// each and every RX_OBJECT_UPDATE event)
|
||||||
NormSize objectSize = NormObjectGetSize(theEvent.object);
|
NormSize objectSize = NormObjectGetSize(theEvent.object);
|
||||||
fprintf(stderr, "sizeof(NormSize) = %d\n", sizeof(NormSize));
|
fprintf(stderr, "sizeof(NormSize) = %d\n", (int)sizeof(NormSize));
|
||||||
NormSize completed = objectSize - NormObjectGetBytesPending(theEvent.object);
|
NormSize completed = objectSize - NormObjectGetBytesPending(theEvent.object);
|
||||||
double percentComplete = 100.0 * ((double)completed/(double)objectSize);
|
double percentComplete = 100.0 * ((double)completed/(double)objectSize);
|
||||||
fprintf(stderr, "normFileRecv: completion status %lu/%lu (%3.0lf%%)\n",
|
fprintf(stderr, "normFileRecv: completion status %lu/%lu (%3.0lf%%)\n",
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
BUILD (Unix):
|
BUILD (Unix):
|
||||||
|
|
||||||
g++ -o normFileSend normFileSend.cpp -D_FILE_OFFSET_BITS=64 -I../common/ \
|
g++ -o normFileSend normFileSend.cpp -D_FILE_OFFSET_BITS=64 -I../common/ \
|
||||||
-I../protolib/common ../unix/libnorm.a ../protolib/unix/libProtokit.a \
|
-I../protolib/include ../lib/libnorm.a ../protolib/lib/libProtokit.a \
|
||||||
-lpthread
|
-lpthread
|
||||||
|
|
||||||
(for MacOS/BSD, add "-lresolv")
|
(for MacOS/BSD, add "-lresolv")
|
||||||
|
|
@ -81,7 +81,7 @@ int main(int argc, char* argv[])
|
||||||
srand(currentTime.tv_sec); // seed random number generator
|
srand(currentTime.tv_sec); // seed random number generator
|
||||||
|
|
||||||
// 3) Set transmission rate
|
// 3) Set transmission rate
|
||||||
NormSetTransmitRate(session, 256.0e+03); // in bits/second
|
NormSetTxRate(session, 25600.0e+03); // in bits/second
|
||||||
|
|
||||||
// Uncomment to use a _specific_ transmit port number
|
// Uncomment to use a _specific_ transmit port number
|
||||||
// (Can be the same as session port (rx port), but this
|
// (Can be the same as session port (rx port), but this
|
||||||
|
|
@ -110,9 +110,10 @@ int main(int argc, char* argv[])
|
||||||
|
|
||||||
// 6) Enter NORM event loop
|
// 6) Enter NORM event loop
|
||||||
bool keepGoing = true;
|
bool keepGoing = true;
|
||||||
NormEvent theEvent;
|
while (keepGoing)
|
||||||
while (keepGoing && NormGetNextEvent(instance, &theEvent))
|
|
||||||
{
|
{
|
||||||
|
NormEvent theEvent;
|
||||||
|
if (!NormGetNextEvent(instance, &theEvent)) continue;
|
||||||
switch (theEvent.type)
|
switch (theEvent.type)
|
||||||
{
|
{
|
||||||
case NORM_TX_QUEUE_VACANCY:
|
case NORM_TX_QUEUE_VACANCY:
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,238 @@
|
||||||
|
/******************************************************************************
|
||||||
|
Simple NORM_OBJECT_STREAM receiver example app using the NORM API
|
||||||
|
(expects NORM message stream of text messages with 2-byte length header (network byte order))
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
|
||||||
|
normStreamRecv
|
||||||
|
|
||||||
|
BUILD (Unix):
|
||||||
|
|
||||||
|
g++ -o normStreamRecv normStreamRecv.cpp -D_FILE_OFFSET_BITS=64 -I../include/ \
|
||||||
|
./lib/libnorm.a ../protolib/lib/libProtokit.a -lpthread
|
||||||
|
|
||||||
|
(for MacOS/BSD, add "-lresolv")
|
||||||
|
(for Solaris, add "-lnsl -lsocket -lresolv")
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
// Notes:
|
||||||
|
// 1) The program also will exit on <CTRL-C> from user
|
||||||
|
// 2) "normStreamRecv" should be started before "normStreamSend" but can join stream in progress.
|
||||||
|
// 3) This example is designed to receive a single stream from a single sender (could be modified
|
||||||
|
// to support multiple streams and/or senders)
|
||||||
|
|
||||||
|
#include "normApi.h" // for NORM API
|
||||||
|
|
||||||
|
#include <stdio.h> // for printf(), etc
|
||||||
|
#include <stdlib.h> // for srand()
|
||||||
|
#include <string.h> // for strrchr()
|
||||||
|
#include <sys/time.h> // for gettimeofday()
|
||||||
|
#include <arpa/inet.h> // for ntohs()
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
// 0) Some default params
|
||||||
|
const unsigned int MSG_LENGTH_MAX = 5000;
|
||||||
|
|
||||||
|
|
||||||
|
// 1) Create a NORM API "NormInstance"
|
||||||
|
NormInstanceHandle instance = NormCreateInstance();
|
||||||
|
|
||||||
|
// 2) Create a NormSession using default "automatic" local node id
|
||||||
|
NormSessionHandle session = NormCreateSession(instance,
|
||||||
|
"127.0.0.1",
|
||||||
|
6003,
|
||||||
|
NORM_NODE_ANY);
|
||||||
|
|
||||||
|
// NOTE: These are debugging routines available
|
||||||
|
// (not necessary for normal app use)
|
||||||
|
// (Need to include "protolib/common/protoDebug.h" for this
|
||||||
|
NormSetDebugLevel(3);
|
||||||
|
// Uncomment to turn on debug NORM message tracing
|
||||||
|
//NormSetMessageTrace(session, true);
|
||||||
|
// Uncomment to write debug output to file "normLog.txt"
|
||||||
|
//NormOpenDebugLog(instance, "normLog.txt");
|
||||||
|
|
||||||
|
|
||||||
|
// Uncomment to turn on some random packet loss for testing
|
||||||
|
//NormSetRxLoss(session, 10.0); // 10% packet loss
|
||||||
|
struct timeval currentTime;
|
||||||
|
gettimeofday(¤tTime, NULL);
|
||||||
|
// Uncomment to get different packet loss patterns from run to run
|
||||||
|
srand(currentTime.tv_sec); // seed random number generator
|
||||||
|
|
||||||
|
|
||||||
|
// Uncomment to enable rx port reuse (this plus unique NormNodeId's enables same-machine send/recv)
|
||||||
|
NormSetRxPortReuse(session, true);
|
||||||
|
|
||||||
|
// 3) Start the receiver with 1 Mbyte buffer per sender
|
||||||
|
NormStartReceiver(session, 8*1024*1024);
|
||||||
|
|
||||||
|
NormSetSilentReceiver(session, true);
|
||||||
|
|
||||||
|
if (!NormSetRxSocketBuffer(session, 8*1024*1024))
|
||||||
|
perror("normStreamRecv error: unable to set requested socket buffer size");
|
||||||
|
|
||||||
|
// We use these variables to keep track of our recv stream
|
||||||
|
// and to buffer reading from the recv stream
|
||||||
|
NormObjectHandle stream = NORM_OBJECT_INVALID; // we use this to make sure we're handling the correct (only) stream
|
||||||
|
bool msgSync = false;
|
||||||
|
char msgBuffer[MSG_LENGTH_MAX];
|
||||||
|
UINT16 msgLen = 0;
|
||||||
|
UINT16 msgIndex = 0;
|
||||||
|
|
||||||
|
// 4) Enter NORM event loop
|
||||||
|
bool keepGoing = true;
|
||||||
|
while (keepGoing)
|
||||||
|
{
|
||||||
|
NormEvent theEvent;
|
||||||
|
if (!NormGetNextEvent(instance, &theEvent)) continue;
|
||||||
|
switch (theEvent.type)
|
||||||
|
{
|
||||||
|
case NORM_RX_OBJECT_NEW:
|
||||||
|
fprintf(stderr, "normStreamRecv: NORM_RX_OBJECT_NEW event ...\n");
|
||||||
|
if (NORM_OBJECT_INVALID == stream)
|
||||||
|
{
|
||||||
|
if (NORM_OBJECT_STREAM == NormObjectGetType(theEvent.object))
|
||||||
|
{
|
||||||
|
stream = theEvent.object;
|
||||||
|
msgLen = msgIndex = 0; // init stream reading state
|
||||||
|
msgSync = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv error: received NORM_RX_OBJECT_NEW for non-stream object?!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv error: received NORM_RX_OBJECT_NEW while already receiving stream?!\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_RX_OBJECT_INFO:
|
||||||
|
{
|
||||||
|
// Assume info contains NULL-terminated string
|
||||||
|
//fprintf(stderr, "normStreamRecv: NORM_RX_OBJECT_INFO event ...\n");
|
||||||
|
if (theEvent.object != stream)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv error: received NORM_RX_OBJECT_UPDATED for unhandled object?!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
char streamInfo[8192];
|
||||||
|
unsigned int infoLen = NormObjectGetInfo(theEvent.object, streamInfo, 8191);
|
||||||
|
streamInfo[infoLen] = '\0';
|
||||||
|
fprintf(stderr, "normStreamRecv: NORM_RX_OBJECT_INFO event, info = \"%s\"\n", streamInfo);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NORM_RX_OBJECT_UPDATED:
|
||||||
|
{
|
||||||
|
|
||||||
|
//fprintf(stderr, "normStreamRecv: NORM_RX_OBJECT_UPDATED event ...\n");
|
||||||
|
if (theEvent.object != stream)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv error: received NORM_RX_OBJECT_UPDATED for unhandled object?!\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
// If we're not "in sync", seek message start
|
||||||
|
if (!msgSync)
|
||||||
|
{
|
||||||
|
msgSync = NormStreamSeekMsgStart(stream);
|
||||||
|
if (!msgSync) break; // wait for next NORM_RX_OBJECT_UPDATED to re-sync
|
||||||
|
}
|
||||||
|
if (msgIndex < 2)
|
||||||
|
{
|
||||||
|
// We still need to read the 2-byte message header for the next message
|
||||||
|
unsigned int numBytes = 2 - msgIndex;
|
||||||
|
if (!NormStreamRead(stream, msgBuffer+msgIndex, &numBytes))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv error: broken stream detected, re-syncing ...\n");
|
||||||
|
msgLen = msgIndex = 0;
|
||||||
|
msgSync = false;
|
||||||
|
continue; // try to re-sync and read again
|
||||||
|
}
|
||||||
|
msgIndex += numBytes;
|
||||||
|
if (msgIndex < 2) break; // wait for next NORM_RX_OBJECT_UPDATED to read more
|
||||||
|
memcpy(&msgLen, msgBuffer, 2);
|
||||||
|
msgLen = ntohs(msgLen);
|
||||||
|
if ((msgLen < 2) || (msgLen > MSG_LENGTH_MAX))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv error: message received with invalid length?!\n");
|
||||||
|
msgLen = msgIndex = 0;
|
||||||
|
msgSync = false;
|
||||||
|
continue; // try to re-sync and read again
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Read "content" portion of message (note "msgIndex" accounts for length "header"
|
||||||
|
unsigned int numBytes = msgLen - msgIndex;
|
||||||
|
if (!NormStreamRead(stream, msgBuffer+msgIndex, &numBytes))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv error: broken stream detected, re-syncing ...\n");
|
||||||
|
msgLen = msgIndex = 0;
|
||||||
|
msgSync = false;
|
||||||
|
continue; // try to re-sync and read again
|
||||||
|
}
|
||||||
|
msgIndex += numBytes;
|
||||||
|
if (msgIndex == msgLen)
|
||||||
|
{
|
||||||
|
// Complete message read
|
||||||
|
//fprintf(stderr, "normStreamRecv msg: %s\n", msgBuffer+2);
|
||||||
|
msgLen = msgIndex = 0; // reset state variables for next message
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break; // wait for next NORM_RX_OBJECT_UPDATED to read more
|
||||||
|
}
|
||||||
|
} // end while(1) (NormStreamRead() loop)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NORM_RX_OBJECT_COMPLETED:
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv: NORM_RX_OBJECT_COMPLETED event ...\n");
|
||||||
|
if (stream == theEvent.object)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv: current stream completed ...\n");
|
||||||
|
stream = NORM_OBJECT_INVALID;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NORM_RX_OBJECT_ABORTED:
|
||||||
|
fprintf(stderr, "normStreamRecv: NORM_RX_OBJECT_ABORTED event ...\n");
|
||||||
|
if (stream == theEvent.object)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamRecv error: current stream aborted ...\n");
|
||||||
|
stream = NORM_OBJECT_INVALID;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_REMOTE_SENDER_NEW:
|
||||||
|
fprintf(stderr, "normStreamRecv: NORM_REMOTE_SENDER_NEW event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_REMOTE_SENDER_ACTIVE:
|
||||||
|
fprintf(stderr, "normStreamRecv: NORM_REMOTE_SENDER_ACTIVE event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_REMOTE_SENDER_INACTIVE:
|
||||||
|
fprintf(stderr, "normStreamRecv: NORM_REMOTE_SENDER_INACTIVE event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_GRTT_UPDATED:
|
||||||
|
fprintf(stderr, "normStreamRecv: NORM_GRTT_UPDATED event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "normStreamRecv: Got event type: %d\n", theEvent.type);
|
||||||
|
} // end switch(theEvent.type)
|
||||||
|
}
|
||||||
|
NormStopReceiver(session);
|
||||||
|
NormDestroySession(session);
|
||||||
|
NormDestroyInstance(instance);
|
||||||
|
|
||||||
|
fprintf(stderr, "normStreamRecv: Done.\n");
|
||||||
|
return 0;
|
||||||
|
} // end main()
|
||||||
|
|
@ -0,0 +1,290 @@
|
||||||
|
/******************************************************************************
|
||||||
|
Simple NORM_OBJECT_DATA sender example app using the NORM API
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
|
||||||
|
normSendStream
|
||||||
|
|
||||||
|
BUILD (Unix):
|
||||||
|
|
||||||
|
g++ -o normStreamSend normStreamSend.cpp -D_FILE_OFFSET_BITS=64 -I../include/ \
|
||||||
|
../lib/libnorm.a ../protolib/lib/libProtokit.a -lpthread
|
||||||
|
|
||||||
|
(for MacOS/BSD, add "-lresolv")
|
||||||
|
(for Solaris, add "-lnsl -lsocket -lresolv")
|
||||||
|
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
// Notes:
|
||||||
|
// 1) A single file is sent.
|
||||||
|
// 2) The program exits upon NORM_TX_FLUSH_COMPLETED notification (or user <CTRL-C>)
|
||||||
|
// 3) NORM receiver should be started first (before sender starts)
|
||||||
|
|
||||||
|
|
||||||
|
#include "normApi.h" // for NORM API
|
||||||
|
|
||||||
|
#include <stdio.h> // for printf(), etc
|
||||||
|
#include <stdlib.h> // for srand()
|
||||||
|
#include <string.h> // for strrchr()
|
||||||
|
#include <sys/time.h> // for gettimeofday()
|
||||||
|
#include <arpa/inet.h> // for htons()
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
// 0) Default parameter values
|
||||||
|
const unsigned int MSG_LENGTH_MIN = 1400;
|
||||||
|
const unsigned int MSG_LENGTH_MAX = 1400;
|
||||||
|
UINT32 streamBufferSize = 4*1024*1024; // 1 Mbyte stream buffer size
|
||||||
|
double normRate = 1.0e+07; // 1 Mbps default NORM tx rate for fixed rate operation (bits/sec units here)
|
||||||
|
double msgRate = -1.0; //1e+06; // 32 kbits/sec default message rate
|
||||||
|
|
||||||
|
// 1) Create a NORM API "NormInstance"
|
||||||
|
NormInstanceHandle instance = NormCreateInstance();
|
||||||
|
|
||||||
|
// 2) Create a NormSession using default "automatic" local node id (based on IP addr)
|
||||||
|
// TBD - add an option to set a specific NormNodeId
|
||||||
|
NormSessionHandle session = NormCreateSession(instance,
|
||||||
|
"loon", //"224.1.2.3",
|
||||||
|
6003,
|
||||||
|
1);//NORM_NODE_ANY);
|
||||||
|
|
||||||
|
// NOTE: These are some debugging routines available
|
||||||
|
// (not necessary for normal app use)
|
||||||
|
NormSetDebugLevel(3);
|
||||||
|
// Uncomment to turn on debug NORM message tracing
|
||||||
|
//NormSetMessageTrace(session, true);
|
||||||
|
// Uncomment to turn on some random packet loss
|
||||||
|
//NormSetTxLoss(session, 25.0); // 25% packet loss for testing purposes
|
||||||
|
|
||||||
|
struct timeval currentTime;
|
||||||
|
gettimeofday(¤tTime, NULL);
|
||||||
|
// Uncomment to get different packet loss patterns from run to run
|
||||||
|
// (and a different sender sessionId)
|
||||||
|
srand(currentTime.tv_sec); // seed random number generator
|
||||||
|
|
||||||
|
// 3) Set transmission rate
|
||||||
|
NormSetTxRate(session, normRate); // in bits/second
|
||||||
|
|
||||||
|
//NormSetFlowControl(session, 0.0);
|
||||||
|
|
||||||
|
// Init GRTT to low value (3 msec)
|
||||||
|
//NormSetGrttEstimate(session, 1.0e-03);
|
||||||
|
|
||||||
|
// Disable receiver backoffs (for lower latency, high speed performance)
|
||||||
|
// (For large group sizes, the default backoff factor is RECOMMENDED)
|
||||||
|
NormSetBackoffFactor(session, 2.0);
|
||||||
|
|
||||||
|
// Uncomment to use a _specific_ transmit port number
|
||||||
|
// (Can be the same as session port (rx port), but this
|
||||||
|
// is _not_ recommended when unicast feedback may be
|
||||||
|
// possible! - must be called _before_ NormStartSender())
|
||||||
|
//NormSetTxPort(session, 6001);
|
||||||
|
|
||||||
|
// Uncomment to enable TCP-friendly congestion control
|
||||||
|
//NormSetCongestionControl(session, true);
|
||||||
|
|
||||||
|
// Uncomment to enable rx port reuse (this plus unique NormNodeId's enables same-machine send/recv)
|
||||||
|
NormSetRxPortReuse(session, true);
|
||||||
|
|
||||||
|
// 4) Start the sender using a random "sessionId"
|
||||||
|
NormSessionId sessionId = (NormSessionId)rand();
|
||||||
|
NormStartSender(session, sessionId, 4*1024*1024, 1300, 64, 16);
|
||||||
|
|
||||||
|
// Uncomment to set large tx socket buffer size
|
||||||
|
// (may be needed to achieve very high packet output rates)
|
||||||
|
//NormSetTxSocketBuffer(session, 512000);
|
||||||
|
|
||||||
|
// 5) Enqueue the NORM_OBJECT_STREAM object
|
||||||
|
// Provide some "info" about this stream (the info is OPTIONAL)
|
||||||
|
char dataInfo[256];
|
||||||
|
sprintf(dataInfo, "NORM_OBJECT_STREAM message stream ...");
|
||||||
|
NormObjectHandle stream = NormStreamOpen(session, streamBufferSize, dataInfo, strlen(dataInfo) + 1);
|
||||||
|
if (NORM_OBJECT_INVALID == stream)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "normStreamSend NormStreamOpen() error!\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6) Write the first stream message
|
||||||
|
// (we enqueue text strings of random length as messages)
|
||||||
|
// ( a 2-byte network byte order length "header" is in each message)
|
||||||
|
unsigned int msgCount = 0;
|
||||||
|
char data = 'a';
|
||||||
|
char msgData[MSG_LENGTH_MAX];
|
||||||
|
UINT16 msgLen = MSG_LENGTH_MIN + (rand() % (MSG_LENGTH_MAX - MSG_LENGTH_MIN + 1));
|
||||||
|
// set 2 byte message header (length in network byte order)
|
||||||
|
UINT16 msgHeader = htons(msgLen);
|
||||||
|
memcpy(msgData, &msgHeader, 2); // 2-byte message length "header"
|
||||||
|
memset(msgData + 2, data, msgLen - 3); // n-byte message content
|
||||||
|
msgData[msgLen - 1] = '\0'; // 1-byte NULL-termination
|
||||||
|
|
||||||
|
// Write the message (as much as stream buffer will accept)
|
||||||
|
unsigned int bytesWritten = NormStreamWrite(stream, msgData, msgLen);
|
||||||
|
bool vacancy = (bytesWritten == msgLen);
|
||||||
|
|
||||||
|
// Initialize the "delayTime" used in "select()" loop below
|
||||||
|
// based on whether message was competely written to stream
|
||||||
|
// (i.e. wait according to "msgRate" (configured bytes per second))
|
||||||
|
double delayTime;
|
||||||
|
if (vacancy)
|
||||||
|
{
|
||||||
|
// Complete message was written, wait msg interval time
|
||||||
|
NormStreamMarkEom(stream);
|
||||||
|
msgCount++;
|
||||||
|
delayTime = (msgRate > 0.0) ? ((double)msgLen / msgRate) : 0.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// wait indefinitely for NORM_TX_QUEUE_VACANCY event
|
||||||
|
// to finish writing current message to stream
|
||||||
|
delayTime = -1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 6) We keep a running "timeAccumulator" value to maintain the proper
|
||||||
|
// _average_ message transmission rate. (TBD - impose "max" accumulation limit)
|
||||||
|
double timeAccumulator = 0.0;
|
||||||
|
struct timeval lastTime;
|
||||||
|
gettimeofday(&lastTime, NULL);
|
||||||
|
|
||||||
|
// 7) We use a "select()" call to wait for NORM events or message interval timeout
|
||||||
|
int normfd = NormGetDescriptor(instance);
|
||||||
|
fd_set fdset;
|
||||||
|
|
||||||
|
struct timeval timeout;
|
||||||
|
|
||||||
|
// 6) Enter NORM event loop
|
||||||
|
bool keepGoing = true;
|
||||||
|
while (keepGoing)
|
||||||
|
{
|
||||||
|
FD_SET(normfd, &fdset);
|
||||||
|
struct timeval* timeoutPtr;
|
||||||
|
if (delayTime < 0.0)
|
||||||
|
{
|
||||||
|
timeoutPtr = NULL; // wait indefinitely (i.e. for queue vacancy)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (delayTime > timeAccumulator)
|
||||||
|
delayTime -= timeAccumulator;
|
||||||
|
else
|
||||||
|
delayTime = 0.0;
|
||||||
|
timeout.tv_sec = (unsigned long)delayTime;
|
||||||
|
timeout.tv_usec = (unsigned long)(1.0e+06 * (delayTime - (double)timeout.tv_sec));
|
||||||
|
timeoutPtr = &timeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
int result = select(normfd+1, &fdset, NULL, NULL, timeoutPtr);
|
||||||
|
|
||||||
|
if (result > 0)
|
||||||
|
{
|
||||||
|
// Get and handle NORM API event
|
||||||
|
NormEvent theEvent;
|
||||||
|
if (NormGetNextEvent(instance, &theEvent))
|
||||||
|
{
|
||||||
|
switch (theEvent.type)
|
||||||
|
{
|
||||||
|
case NORM_TX_QUEUE_EMPTY:
|
||||||
|
case NORM_TX_QUEUE_VACANCY:
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if (NORM_TX_QUEUE_VACANCY == theEvent.type)
|
||||||
|
fprintf(stderr, "normStreamSend: NORM_TX_QUEUE_VACANCY event ...\n");
|
||||||
|
else
|
||||||
|
fprintf(stderr, "normStreamSend: NORM_TX_QUEUE_EMPTY event ...\n");
|
||||||
|
*/
|
||||||
|
if (!vacancy)
|
||||||
|
{
|
||||||
|
// Finish writing remaining pending message content (as much as can be written)
|
||||||
|
bytesWritten += NormStreamWrite(stream, msgData + bytesWritten, msgLen - bytesWritten);
|
||||||
|
if (bytesWritten == msgLen)
|
||||||
|
{
|
||||||
|
// Complete message was written, wait msg interval time
|
||||||
|
NormStreamMarkEom(stream);
|
||||||
|
msgCount++;
|
||||||
|
delayTime = (msgRate > 0.0) ? ((double)msgLen / msgRate) : 0.0;
|
||||||
|
vacancy = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case NORM_TX_OBJECT_PURGED:
|
||||||
|
fprintf(stderr, "normStreamSend: NORM_TX_OBJECT_PURGED event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_TX_FLUSH_COMPLETED:
|
||||||
|
fprintf(stderr, "normStreamSend: NORM_TX_FLUSH_COMPLETED event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case NORM_GRTT_UPDATED:
|
||||||
|
fprintf(stderr, "normStreamRecv: NORM_GRTT_UPDATED event ...\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "normStreamSend: Got event type: %d\n", theEvent.type);
|
||||||
|
} // end switch(theEvent.type)
|
||||||
|
} // end if (NormGetNextEvent())
|
||||||
|
}
|
||||||
|
else if (result < 0)
|
||||||
|
{
|
||||||
|
// select() error
|
||||||
|
perror("normStreamSend: select() error");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This code writes _new_ message(s) to the stream _if_ there is "vacancy"
|
||||||
|
// and it is time based on "msgRate" and how much time has passed since "lastTime"
|
||||||
|
struct timeval currentTime;
|
||||||
|
gettimeofday(¤tTime, NULL);
|
||||||
|
double timeDelta = (double)(currentTime.tv_sec - lastTime.tv_sec);
|
||||||
|
if (currentTime.tv_usec > lastTime.tv_usec)
|
||||||
|
timeDelta += 1.0e-06 * (currentTime.tv_usec - lastTime.tv_usec);
|
||||||
|
else
|
||||||
|
timeDelta -= 1.0e-06 * (lastTime.tv_usec - currentTime.tv_usec);
|
||||||
|
timeAccumulator += timeDelta;
|
||||||
|
while (vacancy && (timeAccumulator > delayTime))
|
||||||
|
{
|
||||||
|
timeAccumulator -= delayTime; // subtract last message tx duration from accumulator
|
||||||
|
// Fill buffer with new message "data" text character (a-z)
|
||||||
|
if (++data > 'z') data = 'a';
|
||||||
|
msgLen = MSG_LENGTH_MIN + (rand() % (MSG_LENGTH_MAX - MSG_LENGTH_MIN + 1));
|
||||||
|
// set 2 byte message header (length in network byte order)
|
||||||
|
msgHeader = htons(msgLen);
|
||||||
|
memcpy(msgData, &msgHeader, 2); // 2-byte message length "header"
|
||||||
|
memset(msgData+2, data, msgLen-3); // n-byte message content
|
||||||
|
msgData[msgLen - 1] = '\0'; // 1-byte NULL-termination
|
||||||
|
bytesWritten = NormStreamWrite(stream, msgData, msgLen);
|
||||||
|
if (bytesWritten < msgLen)
|
||||||
|
{
|
||||||
|
// wait indefinitely for NORM_TX_QUEUE_VACANCY event
|
||||||
|
// to finish writing current message to stream
|
||||||
|
vacancy = false;
|
||||||
|
delayTime = -1.0;
|
||||||
|
//fprintf(stderr, "norm tx stream buffer full, time accumulator = %lf\n", timeAccumulator);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Complete message was written, wait msg interval time
|
||||||
|
NormStreamMarkEom(stream);
|
||||||
|
msgCount++;
|
||||||
|
delayTime = (msgRate > 0.0) ? ((double)msgLen / msgRate) : 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (timeAccumulator <= delayTime)
|
||||||
|
{
|
||||||
|
delayTime -= timeAccumulator;
|
||||||
|
timeAccumulator = 0.0;
|
||||||
|
}
|
||||||
|
lastTime = currentTime;
|
||||||
|
|
||||||
|
} // end while (keepGoing)
|
||||||
|
|
||||||
|
NormStopSender(session);
|
||||||
|
NormDestroySession(session);
|
||||||
|
NormDestroyInstance(instance);
|
||||||
|
|
||||||
|
fprintf(stderr, "normDataSend: Done.\n");
|
||||||
|
return 0;
|
||||||
|
} // end main()
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Example of live plotting of pipe logging data.
|
||||||
|
This has some problems still...
|
||||||
|
'''
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import Queue
|
||||||
|
from optparse import OptionParser
|
||||||
|
|
||||||
|
import Gnuplot
|
||||||
|
|
||||||
|
# Include the local pynorm in the module search path
|
||||||
|
sys.path.insert(0, "../")
|
||||||
|
from pynorm.extra.pipeparser import PipeParser
|
||||||
|
|
||||||
|
USAGE = 'usage: %s [options]' % sys.argv[0]
|
||||||
|
DEFAULT_PIPE = 'normtest'
|
||||||
|
|
||||||
|
def get_option_parser():
|
||||||
|
parser = OptionParser(usage=USAGE)
|
||||||
|
parser.set_defaults(pipe=DEFAULT_PIPE)
|
||||||
|
|
||||||
|
parser.add_option('-p', '--pipe',
|
||||||
|
help='The pipe to connect to (default %s)' % DEFAULT_PIPE)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
(opts, args) = get_option_parser().parse_args(argv)
|
||||||
|
|
||||||
|
if len(args) != 1:
|
||||||
|
print USAGE
|
||||||
|
return 1
|
||||||
|
|
||||||
|
pipep = PipeParser(opts.pipe)
|
||||||
|
pipep.start()
|
||||||
|
|
||||||
|
g = Gnuplot.Gnuplot()
|
||||||
|
g('set data style lines')
|
||||||
|
g.title('FEC Buffer Usage')
|
||||||
|
g.xlabel('Time (s)')
|
||||||
|
g.ylabel('FEC Usage')
|
||||||
|
|
||||||
|
ydata = []
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
report = pipep.reports.get(False)
|
||||||
|
except Queue.Empty:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
ydata.append(report['remote'][0]['fec_cur'])
|
||||||
|
g.plot(list(enumerate(ydata)))
|
||||||
|
except IndexError:
|
||||||
|
continue
|
||||||
|
pipep.reports.task_done()
|
||||||
|
print "Exiting..."
|
||||||
|
# g.reset()
|
||||||
|
# g.close()
|
||||||
|
# del g
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv))
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Example showing reading debug info from a pipe.
|
||||||
|
'''
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import Queue
|
||||||
|
from optparse import OptionParser
|
||||||
|
|
||||||
|
from pynorm.extra.pipeparser import PipeParser
|
||||||
|
|
||||||
|
USAGE = 'usage: %s [options]' % sys.argv[0]
|
||||||
|
DEFAULT_PIPE = 'normtest'
|
||||||
|
|
||||||
|
def get_option_parser():
|
||||||
|
parser = OptionParser(usage=USAGE)
|
||||||
|
parser.set_defaults(pipe=DEFAULT_PIPE)
|
||||||
|
|
||||||
|
parser.add_option('-p', '--pipe',
|
||||||
|
help='The pipe to connect to (default %s)' % DEFAULT_PIPE)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
(opts, args) = get_option_parser().parse_args(argv)
|
||||||
|
|
||||||
|
if len(args) != 1:
|
||||||
|
print USAGE
|
||||||
|
return 1
|
||||||
|
|
||||||
|
pipep = PipeParser(opts.pipe)
|
||||||
|
pipep.start()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
report = pipep.reports.get(True, 3)
|
||||||
|
except Queue.Empty:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
print report['time'], report['remote'][0]['fec_cur']
|
||||||
|
except IndexError:
|
||||||
|
pass
|
||||||
|
pipep.reports.task_done()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv))
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Simple NORM file receiver example app using Python NORM API
|
||||||
|
Shows the usage of the event manager.
|
||||||
|
'''
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os.path
|
||||||
|
from optparse import OptionParser
|
||||||
|
|
||||||
|
sys.path.insert(0, '../')
|
||||||
|
import pynorm
|
||||||
|
from pynorm.extra.manager import Manager, StopManager
|
||||||
|
|
||||||
|
USAGE = 'usage: %s [options] <cacheDir>' % sys.argv[0]
|
||||||
|
DEFAULT_ADDR = '224.1.2.3'
|
||||||
|
DEFAULT_PORT = 6003
|
||||||
|
DEFAULT_PIPE = 'normtest'
|
||||||
|
|
||||||
|
def get_option_parser():
|
||||||
|
parser = OptionParser(usage=USAGE)
|
||||||
|
parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT, debug=0,
|
||||||
|
pipe=DEFAULT_PIPE)
|
||||||
|
|
||||||
|
parser.add_option('-a', '--address',
|
||||||
|
help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
|
||||||
|
parser.add_option('-p', '--port', type=int,
|
||||||
|
help='The port number to listen on (default %i)' % DEFAULT_PORT)
|
||||||
|
parser.add_option('-i', '--iface',
|
||||||
|
help='The inteface to transmit multicast on.')
|
||||||
|
parser.add_option('-d', '--debug', type=int, help='Debug level')
|
||||||
|
parser.add_option('-e', '--pipe', help='Pipe name for logging.')
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
(opts, args) = get_option_parser().parse_args(argv)
|
||||||
|
|
||||||
|
if len(args) != 2:
|
||||||
|
print get_option_parser().get_usage()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
path = os.path.abspath(args[1])
|
||||||
|
|
||||||
|
instance = pynorm.Instance()
|
||||||
|
instance.setCacheDirectory(path)
|
||||||
|
|
||||||
|
try:
|
||||||
|
instance.openDebugPipe(opts.pipe)
|
||||||
|
except pynorm.NormError:
|
||||||
|
print 'Could not connect to pipe, disabling...'
|
||||||
|
pynorm.setDebugLevel(opts.debug)
|
||||||
|
|
||||||
|
manager = Manager(instance)
|
||||||
|
manager.register(pynorm.NORM_RX_OBJECT_INFO, newObject, path)
|
||||||
|
# manager.register(pynorm.NORM_RX_OBJECT_UPDATED, updatedObject)
|
||||||
|
manager.register(pynorm.NORM_RX_OBJECT_COMPLETED, complete)
|
||||||
|
manager.register(pynorm.NORM_RX_OBJECT_ABORTED, abort)
|
||||||
|
manager.start()
|
||||||
|
|
||||||
|
session = instance.createSession(opts.address, opts.port)
|
||||||
|
if opts.iface:
|
||||||
|
session.setMulticastInterface(opts.iface)
|
||||||
|
session.startReceiver(1024*1024)
|
||||||
|
|
||||||
|
print 'Starting listener on %s:%i' % (opts.address, opts.port)
|
||||||
|
try:
|
||||||
|
while True:
|
||||||
|
manager.join(2)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
print 'Exiting...'
|
||||||
|
instance.stop()
|
||||||
|
manager.join()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def newObject(event, path):
|
||||||
|
print 'Filename = %s' % event.object.getInfo()
|
||||||
|
event.object.filename = os.path.join(path, event.object.getInfo())
|
||||||
|
print 'Downloading file %s' % event.object.filename
|
||||||
|
|
||||||
|
def updatedObject(event):
|
||||||
|
print 'File %s - %i bytes left to download' % (event.object.filename,
|
||||||
|
event.object.bytesPending)
|
||||||
|
|
||||||
|
def complete(event):
|
||||||
|
print 'File %s completed' % event.object.filename
|
||||||
|
raise StopManager()
|
||||||
|
|
||||||
|
def abort(event):
|
||||||
|
print 'File %s aborted' % event.object.filename
|
||||||
|
raise StopManager()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv))
|
||||||
|
|
@ -0,0 +1,117 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Simple NORM file sender example app using Python NORM API
|
||||||
|
'''
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os.path
|
||||||
|
import pickle
|
||||||
|
from optparse import OptionParser
|
||||||
|
from random import randint
|
||||||
|
|
||||||
|
import pynorm
|
||||||
|
import pynorm.constants as c
|
||||||
|
|
||||||
|
DEFAULT_ADDR = '224.1.2.3'
|
||||||
|
DEFAULT_PORT = 6003
|
||||||
|
|
||||||
|
def get_option_parser():
|
||||||
|
parser = OptionParser()
|
||||||
|
parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT)
|
||||||
|
|
||||||
|
parser.add_option('-s', '--send',
|
||||||
|
help='The file to send.')
|
||||||
|
parser.add_option('-r', '--receive',
|
||||||
|
help='The directory to cache recieved files.')
|
||||||
|
parser.add_option('-a', '--address',
|
||||||
|
help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
|
||||||
|
parser.add_option('-p', '--port', type=int,
|
||||||
|
help='The port number to listen on (default %i)' % DEFAULT_PORT)
|
||||||
|
parser.add_option('-i', '--iface',
|
||||||
|
help='The inteface to transmit multicast on.')
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
(opts, args) = get_option_parser().parse_args(argv)
|
||||||
|
|
||||||
|
if len(args) != 1:
|
||||||
|
print 'Error: Invalid arguments'
|
||||||
|
print get_option_parser().format_help()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
if opts.send is None and opts.receive is None:
|
||||||
|
print 'No operation specified!'
|
||||||
|
print 'Must provide a --send or --receive flag!'
|
||||||
|
print get_option_parser().format_help()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
instance = pynorm.Instance()
|
||||||
|
session = instance.createSession(opts.address, opts.port)
|
||||||
|
if opts.iface:
|
||||||
|
session.setMulticastInterface(opts.iface)
|
||||||
|
|
||||||
|
session.setTxRate(256e10)
|
||||||
|
session.startReceiver(1024*1024)
|
||||||
|
session.startSender(randint(0, 1000), 1024**2, 1400, 64, 16)
|
||||||
|
|
||||||
|
if opts.receive is not None:
|
||||||
|
path = os.path.abspath(opts.receive)
|
||||||
|
instance.setCacheDirectory(path)
|
||||||
|
print 'Setting cache directory to %s' % path
|
||||||
|
|
||||||
|
if opts.send is not None:
|
||||||
|
filepath = os.path.abspath(opts.send)
|
||||||
|
filename = opts.send[opts.send.rfind('/')+1:]
|
||||||
|
print 'Sending file %s' % filename
|
||||||
|
session.fileEnqueue(filepath, filename)
|
||||||
|
|
||||||
|
try:
|
||||||
|
for event in instance:
|
||||||
|
if event.type == c.NORM_TX_FLUSH_COMPLETED:
|
||||||
|
if event.object.type == c.NORM_OBJECT_FILE:
|
||||||
|
print 'Flush completed for file %s' % event.object.filename
|
||||||
|
|
||||||
|
elif event.type == c.NORM_RX_OBJECT_INFO:
|
||||||
|
if event.object.type == c.NORM_OBJECT_FILE:
|
||||||
|
event.object.filename = os.path.join(path, event.object.info)
|
||||||
|
print 'Downloading file %s' % event.object.filename
|
||||||
|
|
||||||
|
elif event.object.type == c.NORM_OBJECT_DATA:
|
||||||
|
# I put the sender node ID in the info field
|
||||||
|
# If it doesn't match ours, we dont care about it
|
||||||
|
if int(event.object.info) != session.nodeId:
|
||||||
|
event.object.cancel()
|
||||||
|
|
||||||
|
elif event.type == c.NORM_RX_OBJECT_UPDATED:
|
||||||
|
if event.object.type == c.NORM_OBJECT_FILE:
|
||||||
|
print 'File %s - %i bytes left to download' % (
|
||||||
|
event.object.filename, event.object.bytesPending)
|
||||||
|
|
||||||
|
# Let the sender know how much we have done
|
||||||
|
data = pickle.dumps((event.object.filename, event.object.bytesPending), -1)
|
||||||
|
session.dataEnqueue(data, str(event.object.sender.id))
|
||||||
|
|
||||||
|
elif event == 'NORM_RX_OBJECT_COMPLETED':
|
||||||
|
if event.object.type == c.NORM_OBJECT_FILE:
|
||||||
|
print 'File %s completed' % event.object.filename
|
||||||
|
|
||||||
|
elif event.object.type == c.NORM_OBJECT_DATA:
|
||||||
|
try:
|
||||||
|
# This fails sometimes, not sure why yet, so ignore errors
|
||||||
|
filename, pending = pickle.loads(event.object.accessData())
|
||||||
|
except KeyError:
|
||||||
|
continue
|
||||||
|
print 'Node %i - File: %s - Pending: %i' % (event.object.sender.id, filename, pending)
|
||||||
|
|
||||||
|
elif event == 'NORM_RX_OBJECT_ABORTED':
|
||||||
|
if event.object.type == c.NORM_OBJECT_FILE:
|
||||||
|
print 'File %s aborted' % event.object.filename
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
|
print 'Exiting.'
|
||||||
|
return 0
|
||||||
|
# end main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv))
|
||||||
|
|
@ -0,0 +1,71 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Simple NORM file receiver example app using Python NORM API
|
||||||
|
'''
|
||||||
|
|
||||||
|
import sys, os.path
|
||||||
|
from optparse import OptionParser
|
||||||
|
|
||||||
|
import pynorm
|
||||||
|
|
||||||
|
USAGE = 'usage: %s [options] <cacheDir>' % sys.argv[0]
|
||||||
|
DEFAULT_ADDR = '224.1.2.3'
|
||||||
|
DEFAULT_PORT = 6003
|
||||||
|
|
||||||
|
def get_option_parser():
|
||||||
|
parser = OptionParser(usage=USAGE)
|
||||||
|
parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT)
|
||||||
|
|
||||||
|
parser.add_option('-a', '--address',
|
||||||
|
help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
|
||||||
|
parser.add_option('-p', '--port', type=int,
|
||||||
|
help='The port number to listen on (default %i)' % DEFAULT_PORT)
|
||||||
|
parser.add_option('-i', '--iface',
|
||||||
|
help='The inteface to transmit multicast on.')
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
(opts, args) = get_option_parser().parse_args(argv)
|
||||||
|
|
||||||
|
if len(args) != 2:
|
||||||
|
print get_option_parser().get_usage()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
path = os.path.abspath(args[1])
|
||||||
|
|
||||||
|
instance = pynorm.Instance()
|
||||||
|
instance.setCacheDirectory(path)
|
||||||
|
|
||||||
|
session = instance.createSession(opts.address, opts.port)
|
||||||
|
if opts.iface:
|
||||||
|
session.setMulticastInterface(opts.iface)
|
||||||
|
session.startReceiver(1024*1024)
|
||||||
|
|
||||||
|
try:
|
||||||
|
for event in instance:
|
||||||
|
if event == 'NORM_RX_OBJECT_INFO':
|
||||||
|
event.object.filename = os.path.join(path, event.object.info)
|
||||||
|
print 'Downloading file %s' % event.object.filename
|
||||||
|
|
||||||
|
elif event == 'NORM_RX_OBJECT_UPDATED':
|
||||||
|
print 'File %s - %i bytes left to download' % (
|
||||||
|
event.object.filename, event.object.bytesPending)
|
||||||
|
|
||||||
|
elif event == 'NORM_RX_OBJECT_COMPLETED':
|
||||||
|
print 'File %s completed' % event.object.filename
|
||||||
|
return 0
|
||||||
|
|
||||||
|
elif event == 'NORM_RX_OBJECT_ABORTED':
|
||||||
|
print 'File %s aborted' % event.object.filename
|
||||||
|
return 1
|
||||||
|
|
||||||
|
else:
|
||||||
|
print event
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
|
print 'Exiting.'
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv))
|
||||||
|
|
@ -0,0 +1,64 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Simple NORM file sender example app using Python NORM API
|
||||||
|
'''
|
||||||
|
|
||||||
|
import sys, os.path
|
||||||
|
from optparse import OptionParser
|
||||||
|
from random import randint
|
||||||
|
|
||||||
|
import pynorm
|
||||||
|
|
||||||
|
USAGE = 'usage: %s [options] <file>' % sys.argv[0]
|
||||||
|
DEFAULT_ADDR = '224.1.2.3'
|
||||||
|
DEFAULT_PORT = 6003
|
||||||
|
|
||||||
|
def get_option_parser():
|
||||||
|
parser = OptionParser(usage=USAGE)
|
||||||
|
parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT)
|
||||||
|
|
||||||
|
parser.add_option('-a', '--address',
|
||||||
|
help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
|
||||||
|
parser.add_option('-p', '--port', type=int,
|
||||||
|
help='The port number to listen on (default %i)' % DEFAULT_PORT)
|
||||||
|
parser.add_option('-i', '--iface',
|
||||||
|
help='The inteface to transmit multicast on.')
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
(opts, args) = get_option_parser().parse_args(argv)
|
||||||
|
|
||||||
|
if len(args) != 2:
|
||||||
|
print get_option_parser().get_usage()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
filepath = os.path.abspath(args[1])
|
||||||
|
filename = args[1][args[1].rfind('/')+1:]
|
||||||
|
|
||||||
|
instance = pynorm.Instance()
|
||||||
|
|
||||||
|
session = instance.createSession(opts.address, opts.port)
|
||||||
|
if opts.iface:
|
||||||
|
session.setMulticastInterface(opts.iface)
|
||||||
|
session.setTxRate(256e10)
|
||||||
|
session.startSender(randint(0, 1000), 1024**2, 1400, 64, 16)
|
||||||
|
|
||||||
|
print 'Sending file %s' % filename
|
||||||
|
session.fileEnqueue(filepath, filename)
|
||||||
|
|
||||||
|
try:
|
||||||
|
for event in instance:
|
||||||
|
if event == 'NORM_TX_FLUSH_COMPLETED':
|
||||||
|
print 'Flush completed, exiting.'
|
||||||
|
return 0
|
||||||
|
else:
|
||||||
|
print event
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
|
print 'Exiting.'
|
||||||
|
return 0
|
||||||
|
# end main
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv))
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Example of using the NORM library directly.
|
||||||
|
You really shouldn't need to do this. Use the pretty API instead.
|
||||||
|
But its here if you need it.
|
||||||
|
'''
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os.path
|
||||||
|
import ctypes
|
||||||
|
from optparse import OptionParser
|
||||||
|
|
||||||
|
from pynorm.core import libnorm, NormEventStruct
|
||||||
|
import pynorm.constants as c
|
||||||
|
|
||||||
|
USAGE = 'usage: %s [options] <cacheDir>' % sys.argv[0]
|
||||||
|
DEFAULT_ADDR = '224.1.2.3'
|
||||||
|
DEFAULT_PORT = 6003
|
||||||
|
|
||||||
|
def get_option_parser():
|
||||||
|
parser = OptionParser(usage=USAGE)
|
||||||
|
parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT)
|
||||||
|
|
||||||
|
parser.add_option('-a', '--address'
|
||||||
|
help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
|
||||||
|
parser.add_option('-p', '--port', type=int,
|
||||||
|
help='The port number to listen on (default %i)' % DEFAULT_PORT)
|
||||||
|
parser.add_option('-i', '--iface',
|
||||||
|
help='The inteface to transmit multicast on.')
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
(opts, args) = get_option_parser().parse_args(argv)
|
||||||
|
|
||||||
|
if len(args) != 2:
|
||||||
|
print get_option_parser().get_usage()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
path = os.path.abspath(args[1])
|
||||||
|
|
||||||
|
instance = libnorm.NormCreateInstance(False)
|
||||||
|
session = libnorm.NormCreateSession(instance, opts.address, opts.port,
|
||||||
|
c.NORM_NODE_ANY)
|
||||||
|
|
||||||
|
if opts.iface:
|
||||||
|
libnorm.NormSetMulticastInterface(session, opts.iface)
|
||||||
|
|
||||||
|
libnorm.NormSetCacheDirectory(instance, path)
|
||||||
|
libnorm.NormStartReceiver(session, 1024*1024)
|
||||||
|
theEvent = NormEventStruct()
|
||||||
|
|
||||||
|
try:
|
||||||
|
while libnorm.NormGetNextEvent(instance, ctypes.byref(theEvent)):
|
||||||
|
if theEvent.type == c.NORM_RX_OBJECT_NEW:
|
||||||
|
print 'rawRecv.py: NORM_RX_OBJECT_NEW event ...'
|
||||||
|
|
||||||
|
elif theEvent.type == c.NORM_RX_OBJECT_INFO:
|
||||||
|
print 'rafRecv.py: NORM_RX_OBJECT_INFO event ...'
|
||||||
|
|
||||||
|
if c.NORM_OBJECT_FILE == libnorm.NormObjectGetType(theEvent.object):
|
||||||
|
length = libnorm.NormObjectGetInfoLength(theEvent.object)
|
||||||
|
buffer = ctypes.create_string_buffer(length)
|
||||||
|
recv = libnorm.NormObjectGetInfo(theEvent.object, buffer, length)
|
||||||
|
if recv == 0:
|
||||||
|
print 'Error'
|
||||||
|
filename = os.path.join(path, buffer.value)
|
||||||
|
print 'Filename - %s' % filename
|
||||||
|
libnorm.NormFileRename(theEvent.object, filename)
|
||||||
|
|
||||||
|
elif theEvent.type == c.NORM_RX_OBJECT_UPDATED:
|
||||||
|
size = libnorm.NormObjectGetSize(theEvent.object)
|
||||||
|
completed = size - libnorm.NormObjectGetBytesPending(theEvent.object)
|
||||||
|
percent = 100.0 * (float(completed) / float(size))
|
||||||
|
print '%.1f completed' % percent
|
||||||
|
|
||||||
|
elif theEvent.type == c.NORM_RX_OBJECT_COMPLETED:
|
||||||
|
print 'Complete'
|
||||||
|
return 0
|
||||||
|
|
||||||
|
elif theEvent.type == c.NORM_RX_OBJECT_ABORTED:
|
||||||
|
print 'Aborted'
|
||||||
|
return 0
|
||||||
|
|
||||||
|
elif theEvent.type == c.NORM_REMOTE_SENDER_NEW:
|
||||||
|
print 'New sender'
|
||||||
|
|
||||||
|
elif theEvent.type == c.NORM_REMOTE_SENDER_ACTIVE:
|
||||||
|
print 'Sender active'
|
||||||
|
|
||||||
|
elif theEvent.type == c.NORM_REMOTE_SENDER_INACTIVE:
|
||||||
|
print 'Sender inactive'
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
|
libnorm.NormStopReceiver(session)
|
||||||
|
libnorm.NormDestroySession(session)
|
||||||
|
libnorm.NormDestroyInstance(instance)
|
||||||
|
print 'Exiting.'
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv))
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Simple NORM file receiver example app using Python NORM API
|
||||||
|
Shows off streaming with a super simple chat app.
|
||||||
|
'''
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os.path
|
||||||
|
import curses
|
||||||
|
import curses.textpad
|
||||||
|
from threading import Thread
|
||||||
|
from optparse import OptionParser
|
||||||
|
from random import randint
|
||||||
|
|
||||||
|
import pynorm
|
||||||
|
from pynorm.extra.manager import Manager, StopManager
|
||||||
|
|
||||||
|
USAGE = 'usage: %s [options] name' % sys.argv[0]
|
||||||
|
DEFAULT_ADDR = '224.1.2.3'
|
||||||
|
DEFAULT_PORT = 6003
|
||||||
|
|
||||||
|
def get_option_parser():
|
||||||
|
parser = OptionParser(usage=USAGE)
|
||||||
|
parser.set_defaults(address=DEFAULT_ADDR, port=DEFAULT_PORT)
|
||||||
|
|
||||||
|
parser.add_option('-a', '--address',
|
||||||
|
help='The IP address to bind to (default %s)' % DEFAULT_ADDR)
|
||||||
|
parser.add_option('-p', '--port', type=int,
|
||||||
|
help='The port number to listen on (default %i)' % DEFAULT_PORT)
|
||||||
|
parser.add_option('-i', '--iface',
|
||||||
|
help='The inteface to transmit multicast on.')
|
||||||
|
return parser
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
(opts, args) = get_option_parser().parse_args(argv)
|
||||||
|
|
||||||
|
if len(args) != 2:
|
||||||
|
print get_option_parser().get_usage()
|
||||||
|
return 1
|
||||||
|
|
||||||
|
instance = pynorm.Instance()
|
||||||
|
session = instance.createSession(opts.address, opts.port)
|
||||||
|
|
||||||
|
if opts.iface:
|
||||||
|
session.setMulticastInterface(opts.iface)
|
||||||
|
|
||||||
|
session.startReceiver(1024*1024)
|
||||||
|
session.startSender(randint(0, 1000), 1024**2, 1400, 64, 16)
|
||||||
|
stream = session.streamOpen(1024*1024)
|
||||||
|
|
||||||
|
gui = Gui(stream, args[1])
|
||||||
|
|
||||||
|
manager = Manager(instance)
|
||||||
|
manager.register(pynorm.NORM_RX_OBJECT_UPDATED,
|
||||||
|
lambda e: gui.showText(e.object.streamRead(1024)[1]))
|
||||||
|
# manager.register(pynorm.NORM_RX_OBJECT_INFO,
|
||||||
|
# lambda e: gui.showText('%s joined the chat' % e.object.info))
|
||||||
|
manager.start()
|
||||||
|
|
||||||
|
try:
|
||||||
|
curses.wrapper(gui)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
pass
|
||||||
|
|
||||||
|
print 'Exiting...'
|
||||||
|
stream.streamClose(True)
|
||||||
|
instance.stop()
|
||||||
|
manager.join()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
class Gui(object):
|
||||||
|
def __init__(self, stream, name):
|
||||||
|
self.stream = stream
|
||||||
|
self.name = name
|
||||||
|
self.curline = 0
|
||||||
|
|
||||||
|
def __call__(self, stdscr):
|
||||||
|
self.stdscr = stdscr
|
||||||
|
maxy, maxx = stdscr.getmaxyx()
|
||||||
|
|
||||||
|
self.chatwin = curses.newwin(maxy - 2, maxx, 0, 0)
|
||||||
|
self.chatwin.scrollok(True)
|
||||||
|
|
||||||
|
typewin = curses.newwin(1, maxx, maxy-1, 0)
|
||||||
|
|
||||||
|
textbox = curses.textpad.Textbox(typewin)
|
||||||
|
while True:
|
||||||
|
self.send(textbox.edit())
|
||||||
|
typewin.erase()
|
||||||
|
|
||||||
|
def send(self, text):
|
||||||
|
msg = '%s: %s' % (self.name, text)
|
||||||
|
self.stream.streamWrite(msg)
|
||||||
|
self.stream.streamFlush(True)
|
||||||
|
self.showText(msg)
|
||||||
|
|
||||||
|
def showText(self, msg):
|
||||||
|
maxy, maxx = self.stdscr.getmaxyx()
|
||||||
|
if self.curline >= maxy:
|
||||||
|
self.curline = maxy - 1
|
||||||
|
|
||||||
|
self.chatwin.addstr(self.curline, 0, msg)
|
||||||
|
self.curline += 1
|
||||||
|
self.chatwin.refresh()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main(sys.argv))
|
||||||
|
|
@ -47,6 +47,17 @@ typedef uint32_t UINT32;
|
||||||
// C++ code continues to evolve. But, until this notice
|
// C++ code continues to evolve. But, until this notice
|
||||||
// is removed, the API shouldn't be considered final.
|
// is removed, the API shouldn't be considered final.
|
||||||
|
|
||||||
|
#ifndef __cplusplus
|
||||||
|
# include <stdbool.h>
|
||||||
|
# define DEFAULT(arg)
|
||||||
|
#else
|
||||||
|
# define DEFAULT(arg) = arg
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
/** NORM API Types */
|
/** NORM API Types */
|
||||||
typedef const void* NormInstanceHandle;
|
typedef const void* NormInstanceHandle;
|
||||||
extern NORM_API_LINKAGE
|
extern NORM_API_LINKAGE
|
||||||
|
|
@ -78,69 +89,89 @@ typedef off_t NormSize;
|
||||||
#endif // WIN32
|
#endif // WIN32
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
enum NormObjectType
|
typedef enum NormObjectType
|
||||||
{
|
{
|
||||||
NORM_OBJECT_NONE,
|
NORM_OBJECT_NONE,
|
||||||
NORM_OBJECT_DATA,
|
NORM_OBJECT_DATA,
|
||||||
NORM_OBJECT_FILE,
|
NORM_OBJECT_FILE,
|
||||||
NORM_OBJECT_STREAM
|
NORM_OBJECT_STREAM
|
||||||
};
|
} NormObjectType;
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
enum NormFlushMode
|
typedef enum NormFlushMode
|
||||||
{
|
{
|
||||||
NORM_FLUSH_NONE,
|
NORM_FLUSH_NONE,
|
||||||
NORM_FLUSH_PASSIVE,
|
NORM_FLUSH_PASSIVE,
|
||||||
NORM_FLUSH_ACTIVE
|
NORM_FLUSH_ACTIVE
|
||||||
};
|
} NormFlushMode;
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
enum NormNackingMode
|
typedef enum NormNackingMode
|
||||||
{
|
{
|
||||||
NORM_NACK_NONE,
|
NORM_NACK_NONE,
|
||||||
NORM_NACK_INFO_ONLY,
|
NORM_NACK_INFO_ONLY,
|
||||||
NORM_NACK_NORMAL
|
NORM_NACK_NORMAL
|
||||||
};
|
} NormNackingMode;
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
enum NormAckingStatus
|
typedef enum NormAckingStatus
|
||||||
{
|
{
|
||||||
NORM_ACK_INVALID,
|
NORM_ACK_INVALID,
|
||||||
NORM_ACK_FAILURE,
|
NORM_ACK_FAILURE,
|
||||||
NORM_ACK_PENDING,
|
NORM_ACK_PENDING,
|
||||||
NORM_ACK_SUCCESS
|
NORM_ACK_SUCCESS
|
||||||
};
|
} NormAckingStatus;
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
enum NormProbingMode
|
typedef enum NormTrackingStatus
|
||||||
|
{
|
||||||
|
NORM_TRACK_NONE,
|
||||||
|
NORM_TRACK_RECEIVERS,
|
||||||
|
NORM_TRACK_SENDERS,
|
||||||
|
NORM_TRACK_ALL
|
||||||
|
} NormTrackingStatus;
|
||||||
|
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
typedef enum NormProbingMode
|
||||||
{
|
{
|
||||||
NORM_PROBE_NONE,
|
NORM_PROBE_NONE,
|
||||||
NORM_PROBE_PASSIVE,
|
NORM_PROBE_PASSIVE,
|
||||||
NORM_PROBE_ACTIVE
|
NORM_PROBE_ACTIVE
|
||||||
};
|
} NormProbingMode;
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
enum NormRepairBoundary
|
typedef enum NormSyncPolicy
|
||||||
|
{
|
||||||
|
NORM_SYNC_CURRENT, // attempt to receiver current/new objects only
|
||||||
|
NORM_SYNC_ALL // attempt to receive old and new objects
|
||||||
|
} NormSyncPolicy;
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
typedef enum NormRepairBoundary
|
||||||
{
|
{
|
||||||
NORM_BOUNDARY_BLOCK,
|
NORM_BOUNDARY_BLOCK,
|
||||||
NORM_BOUNDARY_OBJECT
|
NORM_BOUNDARY_OBJECT
|
||||||
};
|
} NormRepairBoundary;
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
enum NormEventType
|
typedef enum NormEventType
|
||||||
{
|
{
|
||||||
NORM_EVENT_INVALID = 0,
|
NORM_EVENT_INVALID = 0,
|
||||||
NORM_TX_QUEUE_VACANCY,
|
NORM_TX_QUEUE_VACANCY,
|
||||||
NORM_TX_QUEUE_EMPTY,
|
NORM_TX_QUEUE_EMPTY,
|
||||||
NORM_TX_FLUSH_COMPLETED,
|
NORM_TX_FLUSH_COMPLETED,
|
||||||
NORM_TX_WATERMARK_COMPLETED,
|
NORM_TX_WATERMARK_COMPLETED,
|
||||||
|
NORM_TX_CMD_SENT,
|
||||||
NORM_TX_OBJECT_SENT,
|
NORM_TX_OBJECT_SENT,
|
||||||
NORM_TX_OBJECT_PURGED,
|
NORM_TX_OBJECT_PURGED,
|
||||||
|
NORM_TX_RATE_CHANGED,
|
||||||
NORM_LOCAL_SENDER_CLOSED,
|
NORM_LOCAL_SENDER_CLOSED,
|
||||||
NORM_REMOTE_SENDER_NEW,
|
NORM_REMOTE_SENDER_NEW,
|
||||||
NORM_REMOTE_SENDER_ACTIVE,
|
NORM_REMOTE_SENDER_ACTIVE,
|
||||||
NORM_REMOTE_SENDER_INACTIVE,
|
NORM_REMOTE_SENDER_INACTIVE,
|
||||||
NORM_REMOTE_SENDER_PURGED,
|
NORM_REMOTE_SENDER_PURGED,
|
||||||
|
NORM_RX_CMD_NEW,
|
||||||
NORM_RX_OBJECT_NEW,
|
NORM_RX_OBJECT_NEW,
|
||||||
NORM_RX_OBJECT_INFO,
|
NORM_RX_OBJECT_INFO,
|
||||||
NORM_RX_OBJECT_UPDATED,
|
NORM_RX_OBJECT_UPDATED,
|
||||||
|
|
@ -149,7 +180,7 @@ enum NormEventType
|
||||||
NORM_GRTT_UPDATED,
|
NORM_GRTT_UPDATED,
|
||||||
NORM_CC_ACTIVE,
|
NORM_CC_ACTIVE,
|
||||||
NORM_CC_INACTIVE
|
NORM_CC_INACTIVE
|
||||||
};
|
} NormEventType;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|
@ -162,7 +193,7 @@ typedef struct
|
||||||
|
|
||||||
/** NORM API General Initialization and Operation Functions */
|
/** NORM API General Initialization and Operation Functions */
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
NormInstanceHandle NormCreateInstance(bool priorityBoost = false);
|
NormInstanceHandle NormCreateInstance(bool priorityBoost DEFAULT(false));
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormDestroyInstance(NormInstanceHandle instanceHandle);
|
void NormDestroyInstance(NormInstanceHandle instanceHandle);
|
||||||
|
|
@ -190,7 +221,7 @@ bool NormSetCacheDirectory(NormInstanceHandle instanceHandle,
|
||||||
// This call blocks until the next NormEvent is ready unless asynchronous
|
// This call blocks until the next NormEvent is ready unless asynchronous
|
||||||
// notification is used (see below)
|
// notification is used (see below)
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
bool NormGetNextEvent(NormInstanceHandle instanceHandle, NormEvent* theEvent);
|
bool NormGetNextEvent(NormInstanceHandle instanceHandle, NormEvent* theEvent, bool waitForEvent DEFAULT(true));
|
||||||
|
|
||||||
// The "NormGetDescriptor()" function returns a HANDLE (WIN32) or
|
// The "NormGetDescriptor()" function returns a HANDLE (WIN32) or
|
||||||
// a file descriptor (UNIX) which can be used for async notification
|
// a file descriptor (UNIX) which can be used for async notification
|
||||||
|
|
@ -230,14 +261,45 @@ const void* NormGetUserData(NormSessionHandle sessionHandle);
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
NormNodeId NormGetLocalNodeId(NormSessionHandle sessionHandle);
|
NormNodeId NormGetLocalNodeId(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetTxPort(NormSessionHandle sessionHandle,
|
bool NormSetTxPort(NormSessionHandle sessionHandle,
|
||||||
UINT16 txPortNumber);
|
UINT16 txPortNumber,
|
||||||
|
bool enableReuse DEFAULT(false),
|
||||||
|
const char* txBindAddress DEFAULT((const char*)0)); // if non-NULL, bind() to <txBindAddress>/<txPortNumber>
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
UINT16 NormGetTxPort(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormSetTxOnly(NormSessionHandle sessionHandle,
|
||||||
|
bool txOnly,
|
||||||
|
bool connectToSessionAddress DEFAULT(false));
|
||||||
|
|
||||||
|
|
||||||
|
// This does not affect the rx_socket binding if already bound
|
||||||
|
// (i.e., just affects where NORM packets are sent)
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
bool NormChangeDestination(NormSessionHandle sessionHandle,
|
||||||
|
const char* sessionAddress,
|
||||||
|
UINT16 sessionPort);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetRxPortReuse(NormSessionHandle sessionHandle,
|
void NormSetRxPortReuse(NormSessionHandle sessionHandle,
|
||||||
bool enable,
|
bool enableReuse,
|
||||||
bool bindToSessionAddress = true);
|
const char* rxBindAddress DEFAULT((const char*)0), // if non-NULL, bind() to <rxBindAddress>/<sessionPort>
|
||||||
|
const char* senderAddress DEFAULT((const char*)0), // if non-NULL, connect() to <senderAddress>/<senderPort>
|
||||||
|
UINT16 senderPort DEFAULT(0));
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
UINT16 NormGetRxPort(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
|
// TBD - We should probably have a "NormSetCCMode(NormCCMode ccMode)" function for users
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormSetEcnSupport(NormSessionHandle sessionHandle,
|
||||||
|
bool ecnEnable, // enables NORM ECN (congestion control) support
|
||||||
|
bool ignoreLoss DEFAULT(false), // With "ecnEnable", use ECN-only, ignoring packet loss
|
||||||
|
bool tolerateLoss DEFAULT(false)); // loss-tolerant congestion control, ecnEnable or not, ignoreLoss = false
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
bool NormSetMulticastInterface(NormSessionHandle sessionHandle,
|
bool NormSetMulticastInterface(NormSessionHandle sessionHandle,
|
||||||
|
|
@ -255,19 +317,50 @@ NORM_API_LINKAGE
|
||||||
bool NormSetLoopback(NormSessionHandle sessionHandle,
|
bool NormSetLoopback(NormSessionHandle sessionHandle,
|
||||||
bool loopback);
|
bool loopback);
|
||||||
|
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
bool NormSetFragmentation(NormSessionHandle sessionHandle,
|
||||||
|
bool fragmentation);
|
||||||
|
|
||||||
// Special functions for debug support
|
// Special functions for debug support
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetMessageTrace(NormSessionHandle sessionHandle, bool state);
|
void NormSetMessageTrace(NormSessionHandle sessionHandle, bool state);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetTxLoss(NormSessionHandle sessionHandle, double percent);
|
void NormSetTxLoss(NormSessionHandle sessionHandle, double percent);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetRxLoss(NormSessionHandle sessionHandle, double percent);
|
void NormSetRxLoss(NormSessionHandle sessionHandle, double percent);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
bool NormOpenDebugLog(NormInstanceHandle instanceHandle, const char *path);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormCloseDebugLog(NormInstanceHandle instanceHandle);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
bool NormOpenDebugPipe(NormInstanceHandle instanceHandle, const char *pipeName);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormCloseDebugPipe(NormInstanceHandle instanceHandle);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormSetDebugLevel(unsigned int level);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
unsigned int NormGetDebugLevel();
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormSetReportInterval(NormSessionHandle sessionHandle, double interval);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
double NormGetReportInterval(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
/** NORM Sender Functions */
|
/** NORM Sender Functions */
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
bool NormStartSender(NormSessionHandle sessionHandle,
|
bool NormStartSender(NormSessionHandle sessionHandle,
|
||||||
NormSessionId sessionId,
|
NormSessionId instanceId,
|
||||||
UINT32 bufferSpace,
|
UINT32 bufferSpace,
|
||||||
UINT16 segmentSize,
|
UINT16 segmentSize,
|
||||||
unsigned char numData,
|
unsigned char numData,
|
||||||
|
|
@ -277,27 +370,31 @@ NORM_API_LINKAGE
|
||||||
void NormStopSender(NormSessionHandle sessionHandle);
|
void NormStopSender(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
double NormGetTransmitRate(NormSessionHandle sessionHandle);
|
void NormSetTxRate(NormSessionHandle sessionHandle,
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
|
||||||
void NormSetTransmitRate(NormSessionHandle sessionHandle,
|
|
||||||
double bitsPerSecond);
|
double bitsPerSecond);
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
double NormGetTxRate(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
bool NormSetTxSocketBuffer(NormSessionHandle sessionHandle,
|
bool NormSetTxSocketBuffer(NormSessionHandle sessionHandle,
|
||||||
unsigned int bufferSize);
|
unsigned int bufferSize);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetCongestionControl(NormSessionHandle sessionHandle,
|
void NormSetFlowControl(NormSessionHandle sessionHandle,
|
||||||
bool state);
|
double flowControlFactor);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetTransmitRateBounds(NormSessionHandle sessionHandle,
|
void NormSetCongestionControl(NormSessionHandle sessionHandle,
|
||||||
|
bool enable,
|
||||||
|
bool adjustRate DEFAULT(true));
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormSetTxRateBounds(NormSessionHandle sessionHandle,
|
||||||
double rateMin,
|
double rateMin,
|
||||||
double rateMax);
|
double rateMax);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetTransmitCacheBounds(NormSessionHandle sessionHandle,
|
void NormSetTxCacheBounds(NormSessionHandle sessionHandle,
|
||||||
NormSize sizeMax,
|
NormSize sizeMax,
|
||||||
UINT32 countMin,
|
UINT32 countMin,
|
||||||
UINT32 countMax);
|
UINT32 countMax);
|
||||||
|
|
@ -341,25 +438,28 @@ void NormSetTxRobustFactor(NormSessionHandle sessionHandle,
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
NormObjectHandle NormFileEnqueue(NormSessionHandle sessionHandle,
|
NormObjectHandle NormFileEnqueue(NormSessionHandle sessionHandle,
|
||||||
const char* fileName,
|
const char* fileName,
|
||||||
const char* infoPtr = (const char*)0,
|
const char* infoPtr DEFAULT((const char*)0),
|
||||||
unsigned int infoLen = 0);
|
unsigned int infoLen DEFAULT(0));
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
NormObjectHandle NormDataEnqueue(NormSessionHandle sessionHandle,
|
NormObjectHandle NormDataEnqueue(NormSessionHandle sessionHandle,
|
||||||
const char* dataPtr,
|
const char* dataPtr,
|
||||||
UINT32 dataLen,
|
UINT32 dataLen,
|
||||||
const char* infoPtr = (const char*)0,
|
const char* infoPtr DEFAULT((const char*)0),
|
||||||
unsigned int infoLen = 0);
|
unsigned int infoLen DEFAULT(0));
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
bool NormRequeueObject(NormSessionHandle sessionHandle, NormObjectHandle objectHandle);
|
bool NormRequeueObject(NormSessionHandle sessionHandle, NormObjectHandle objectHandle);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle,
|
NormObjectHandle NormStreamOpen(NormSessionHandle sessionHandle,
|
||||||
UINT32 bufferSize);
|
UINT32 bufferSize,
|
||||||
|
const char* infoPtr DEFAULT((const char*)0),
|
||||||
|
unsigned int infoLen DEFAULT(0));
|
||||||
|
|
||||||
|
// TBD - we should add a "bool watermark" option to "graceful" stream closure???
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormStreamClose(NormObjectHandle streamHandle, bool graceful = false);
|
void NormStreamClose(NormObjectHandle streamHandle, bool graceful DEFAULT(false));
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
unsigned int NormStreamWrite(NormObjectHandle streamHandle,
|
unsigned int NormStreamWrite(NormObjectHandle streamHandle,
|
||||||
|
|
@ -368,8 +468,8 @@ unsigned int NormStreamWrite(NormObjectHandle streamHandle,
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormStreamFlush(NormObjectHandle streamHandle,
|
void NormStreamFlush(NormObjectHandle streamHandle,
|
||||||
bool eom = false,
|
bool eom DEFAULT(false),
|
||||||
NormFlushMode flushMode = NORM_FLUSH_PASSIVE);
|
NormFlushMode flushMode DEFAULT(NORM_FLUSH_PASSIVE));
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormStreamSetAutoFlush(NormObjectHandle streamHandle,
|
void NormStreamSetAutoFlush(NormObjectHandle streamHandle,
|
||||||
|
|
@ -387,7 +487,10 @@ void NormStreamMarkEom(NormObjectHandle streamHandle);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
bool NormSetWatermark(NormSessionHandle sessionHandle,
|
bool NormSetWatermark(NormSessionHandle sessionHandle,
|
||||||
NormObjectHandle objectHandle);
|
NormObjectHandle objectHandle,
|
||||||
|
bool overrideFlush DEFAULT(false));
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
bool NormResetWatermark(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormCancelWatermark(NormSessionHandle sessionHandle);
|
void NormCancelWatermark(NormSessionHandle sessionHandle);
|
||||||
|
|
@ -400,9 +503,27 @@ NORM_API_LINKAGE
|
||||||
void NormRemoveAckingNode(NormSessionHandle sessionHandle,
|
void NormRemoveAckingNode(NormSessionHandle sessionHandle,
|
||||||
NormNodeId nodeId);
|
NormNodeId nodeId);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormSetAutoAckingNodes(NormSessionHandle sessionHandle,
|
||||||
|
NormTrackingStatus trackingStatus);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
NormAckingStatus NormGetAckingStatus(NormSessionHandle sessionHandle,
|
NormAckingStatus NormGetAckingStatus(NormSessionHandle sessionHandle,
|
||||||
NormNodeId nodeId = NORM_NODE_ANY);
|
NormNodeId nodeId DEFAULT(NORM_NODE_ANY));
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
bool NormGetNextAckingNode(NormSessionHandle sessionHandle,
|
||||||
|
NormNodeId* nodeId,
|
||||||
|
NormAckingStatus* ackingStatus);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
bool NormSendCommand(NormSessionHandle sessionHandle,
|
||||||
|
const char* cmdBuffer,
|
||||||
|
unsigned int cmdLength,
|
||||||
|
bool robust DEFAULT(false));
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormCancelCommand(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
/* NORM Receiver Functions */
|
/* NORM Receiver Functions */
|
||||||
|
|
||||||
|
|
@ -413,6 +534,10 @@ bool NormStartReceiver(NormSessionHandle sessionHandle,
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormStopReceiver(NormSessionHandle sessionHandle);
|
void NormStopReceiver(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormSetRxCacheLimit(NormSessionHandle sessionHandle,
|
||||||
|
unsigned short countMax);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
bool NormSetRxSocketBuffer(NormSessionHandle sessionHandle,
|
bool NormSetRxSocketBuffer(NormSessionHandle sessionHandle,
|
||||||
unsigned int bufferSize);
|
unsigned int bufferSize);
|
||||||
|
|
@ -420,7 +545,7 @@ bool NormSetRxSocketBuffer(NormSessionHandle sessionHandle,
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetSilentReceiver(NormSessionHandle sessionHandle,
|
void NormSetSilentReceiver(NormSessionHandle sessionHandle,
|
||||||
bool silent,
|
bool silent,
|
||||||
int maxDelay = -1);
|
int maxDelay DEFAULT(-1));
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetDefaultUnicastNack(NormSessionHandle sessionHandle,
|
void NormSetDefaultUnicastNack(NormSessionHandle sessionHandle,
|
||||||
|
|
@ -430,12 +555,16 @@ NORM_API_LINKAGE
|
||||||
void NormNodeSetUnicastNack(NormNodeHandle remoteSender,
|
void NormNodeSetUnicastNack(NormNodeHandle remoteSender,
|
||||||
bool unicastNacks);
|
bool unicastNacks);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormSetDefaultSyncPolicy(NormSessionHandle sessionHandle,
|
||||||
|
NormSyncPolicy syncPolicy);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormSetDefaultNackingMode(NormSessionHandle sessionHandle,
|
void NormSetDefaultNackingMode(NormSessionHandle sessionHandle,
|
||||||
NormNackingMode nackingMode);
|
NormNackingMode nackingMode);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormNodeSetNackingMode(NormNodeHandle nodeHandle,
|
void NormNodeSetNackingMode(NormNodeHandle remoteSender,
|
||||||
NormNackingMode nackingMode);
|
NormNackingMode nackingMode);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
|
|
@ -447,7 +576,7 @@ void NormSetDefaultRepairBoundary(NormSessionHandle sessionHandle,
|
||||||
NormRepairBoundary repairBoundary);
|
NormRepairBoundary repairBoundary);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormNodeSetRepairBoundary(NormNodeHandle nodeHandle,
|
void NormNodeSetRepairBoundary(NormNodeHandle remoteSender,
|
||||||
NormRepairBoundary repairBoundary);
|
NormRepairBoundary repairBoundary);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
|
|
@ -455,7 +584,7 @@ void NormSetDefaultRxRobustFactor(NormSessionHandle sessionHandle,
|
||||||
int robustFactor);
|
int robustFactor);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormNodeSetRxRobustFactor(NormNodeHandle nodeHandle,
|
void NormNodeSetRxRobustFactor(NormNodeHandle remoteSender,
|
||||||
int robustFactor);
|
int robustFactor);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
|
|
@ -469,6 +598,8 @@ bool NormStreamSeekMsgStart(NormObjectHandle streamHandle);
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
UINT32 NormStreamGetReadOffset(NormObjectHandle streamHandle);
|
UINT32 NormStreamGetReadOffset(NormObjectHandle streamHandle);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
UINT32 NormStreamGetBufferUsage(NormObjectHandle streamHandle);
|
||||||
|
|
||||||
/** NORM Object Functions */
|
/** NORM Object Functions */
|
||||||
|
|
||||||
|
|
@ -511,7 +642,7 @@ bool NormFileRename(NormObjectHandle fileHandle,
|
||||||
const char* fileName);
|
const char* fileName);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
const char*volatile NormDataAccessData(NormObjectHandle objectHandle);
|
const char* NormDataAccessData(NormObjectHandle objectHandle);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
char* NormDataDetachData(NormObjectHandle objectHandle);
|
char* NormDataDetachData(NormObjectHandle objectHandle);
|
||||||
|
|
@ -528,23 +659,29 @@ NORM_API_LINKAGE
|
||||||
bool NormNodeGetAddress(NormNodeHandle nodeHandle,
|
bool NormNodeGetAddress(NormNodeHandle nodeHandle,
|
||||||
char* addrBuffer,
|
char* addrBuffer,
|
||||||
unsigned int* bufferLen,
|
unsigned int* bufferLen,
|
||||||
UINT16* port = (UINT16*)0);
|
UINT16* port DEFAULT((UINT16*)0));
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
double NormNodeGetGrtt(NormNodeHandle nodeHandle);
|
double NormNodeGetGrtt(NormNodeHandle remoteSender);
|
||||||
|
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormNodeFreeBuffers(NormNodeHandle nodeHandle);
|
bool NormNodeGetCommand(NormNodeHandle remoteSender,
|
||||||
|
char* buffer,
|
||||||
|
unsigned int* buflen);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormNodeFreeBuffers(NormNodeHandle remoteSender);
|
||||||
|
|
||||||
|
NORM_API_LINKAGE
|
||||||
|
void NormNodeDelete(NormNodeHandle remoteSender);
|
||||||
|
|
||||||
// The next 4 functions have not yet been implemented
|
// The next 4 functions have not yet been implemented
|
||||||
// (work in progress)
|
// (work in progress)
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
void NormNodeSetAutoDelete(NormNodeHandle nodeHandle,
|
void NormNodeSetAutoDelete(NormNodeHandle remoteSender,
|
||||||
bool autoDelete);
|
bool autoDelete);
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
|
||||||
void NormNodeDeleteSender(NormNodeHandle nodeHandle);
|
|
||||||
|
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
bool NormNodeAllowSender(NormNodeId senderId);
|
bool NormNodeAllowSender(NormNodeId senderId);
|
||||||
|
|
||||||
|
|
@ -563,4 +700,8 @@ void NormNodeRelease(NormNodeHandle nodeHandle);
|
||||||
NORM_API_LINKAGE
|
NORM_API_LINKAGE
|
||||||
UINT32 NormCountCompletedObjects(NormSessionHandle sessionHandle);
|
UINT32 NormCountCompletedObjects(NormSessionHandle sessionHandle);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} // end extern "C"
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#endif // _NORM_API
|
#endif // _NORM_API
|
||||||
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*********************************************************************
|
||||||
|
*
|
||||||
|
* AUTHORIZATION TO USE AND DISTRIBUTE
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that:
|
||||||
|
*
|
||||||
|
* (1) source code distributions retain this paragraph in its entirety,
|
||||||
|
*
|
||||||
|
* (2) distributions including binary code include this paragraph in
|
||||||
|
* its entirety in the documentation or other materials provided
|
||||||
|
* with the distribution, and
|
||||||
|
*
|
||||||
|
* (3) all advertising materials mentioning features or use of this
|
||||||
|
* software display the following acknowledgment:
|
||||||
|
*
|
||||||
|
* "This product includes software written and developed
|
||||||
|
* by Brian Adamson and Joe Macker of the Naval Research
|
||||||
|
* Laboratory (NRL)."
|
||||||
|
*
|
||||||
|
* The name of NRL, the name(s) of NRL employee(s), or any entity
|
||||||
|
* of the United States Government may not be used to endorse or
|
||||||
|
* promote products derived from this software, nor does the
|
||||||
|
* inclusion of the NRL written and developed software directly or
|
||||||
|
* indirectly suggest NRL or United States Government endorsement
|
||||||
|
* of this product.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
|
#ifndef _NORM_ENCODER
|
||||||
|
#define _NORM_ENCODER
|
||||||
|
|
||||||
|
#include "protokit.h" // protolib stuff
|
||||||
|
|
||||||
|
class NormEncoder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~NormEncoder();
|
||||||
|
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize) = 0;
|
||||||
|
virtual void Destroy() = 0;
|
||||||
|
virtual void Encode(unsigned int segmentId, const char *dataVector, char **parityVectorList) = 0;
|
||||||
|
}; // end class NormEncoder
|
||||||
|
|
||||||
|
class NormDecoder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~NormDecoder();
|
||||||
|
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize) = 0;
|
||||||
|
virtual void Destroy() = 0;
|
||||||
|
virtual int Decode(char** vectorList, unsigned int numData, unsigned int erasureCount, unsigned int* erasureLocs) = 0;
|
||||||
|
}; // end class NormDecoder
|
||||||
|
|
||||||
|
#endif // _NORM_ENCODER
|
||||||
|
|
@ -30,43 +30,22 @@
|
||||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
#ifndef _NORM_ENCODER
|
#ifndef _NORM_ENCODER_MDP
|
||||||
#define _NORM_ENCODER
|
#define _NORM_ENCODER_MDP
|
||||||
|
|
||||||
#include "protokit.h" // protolib stuff
|
#include "normEncoder.h"
|
||||||
|
|
||||||
class NormEncoder
|
class NormEncoderMDP : public NormEncoder
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~NormEncoder();
|
|
||||||
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize) = 0;
|
|
||||||
virtual void Destroy() = 0;
|
|
||||||
virtual void Encode(const char *dataVector, char **parityVectorList) = 0;
|
|
||||||
}; // end class NormEncoder
|
|
||||||
|
|
||||||
class NormDecoder
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~NormDecoder();
|
|
||||||
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize) = 0;
|
|
||||||
virtual void Destroy() = 0;
|
|
||||||
virtual int Decode(char** vectorList, unsigned int numData, unsigned int erasureCount, unsigned int* erasureLocs) = 0;
|
|
||||||
}; // end class NormDecoder
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class NormEncoderRS8a : public NormEncoder
|
|
||||||
{
|
{
|
||||||
// Methods
|
// Methods
|
||||||
public:
|
public:
|
||||||
NormEncoderRS8a();
|
NormEncoderMDP();
|
||||||
~NormEncoderRS8a();
|
~NormEncoderMDP();
|
||||||
bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize);
|
bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize);
|
||||||
void Destroy();
|
void Destroy();
|
||||||
bool IsReady(){return (bool)(gen_poly != NULL);}
|
bool IsReady(){return (bool)(gen_poly != NULL);}
|
||||||
|
// "Encode" MUST be called in order of source vector0, vector1, vector2, etc
|
||||||
// "Encode" must be called in order of source vector0, vector1, vector2, etc
|
void Encode(unsigned int segmentId, const char *dataVector, char **parityVectorList);
|
||||||
void Encode(const char *dataVector, char **parityVectorList);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool CreateGeneratorPolynomial();
|
bool CreateGeneratorPolynomial();
|
||||||
|
|
@ -77,15 +56,15 @@ class NormEncoderRS8a : public NormEncoder
|
||||||
unsigned char* gen_poly; // Ptr to generator polynomial
|
unsigned char* gen_poly; // Ptr to generator polynomial
|
||||||
unsigned char* scratch; // scratch space for encoding
|
unsigned char* scratch; // scratch space for encoding
|
||||||
|
|
||||||
}; // end class NormEncoderRS8a
|
}; // end class NormEncoderMDP
|
||||||
|
|
||||||
|
|
||||||
class NormDecoderRS8a : public NormDecoder
|
class NormDecoderMDP : public NormDecoder
|
||||||
{
|
{
|
||||||
// Methods
|
// Methods
|
||||||
public:
|
public:
|
||||||
NormDecoderRS8a();
|
NormDecoderMDP();
|
||||||
~NormDecoderRS8a();
|
~NormDecoderMDP();
|
||||||
bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize);
|
bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize);
|
||||||
int Decode(char** vectorList, unsigned int numData, unsigned int erasureCount, unsigned int* erasureLocs);
|
int Decode(char** vectorList, unsigned int numData, unsigned int erasureCount, unsigned int* erasureLocs);
|
||||||
int NumParity() {return npar;}
|
int NumParity() {return npar;}
|
||||||
|
|
@ -101,8 +80,7 @@ class NormDecoderRS8a : public NormDecoder
|
||||||
unsigned char** o_vec; // Omega vectors (pointers to "npar" vectors)
|
unsigned char** o_vec; // Omega vectors (pointers to "npar" vectors)
|
||||||
unsigned char* scratch;
|
unsigned char* scratch;
|
||||||
|
|
||||||
}; // end class NormDecoderRS8a
|
}; // end class NormDecoderMDP
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _NORM_ENCODER_MDP
|
||||||
#endif // _NORM_ENCODER
|
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
#ifndef _NORM_ENCODER_RS16
|
||||||
|
#define _NORM_ENCODER_RS16
|
||||||
|
|
||||||
|
#include "normEncoder.h"
|
||||||
|
#include "protoDefs.h" // for UINT16
|
||||||
|
|
||||||
|
class NormEncoderRS16 : public NormEncoder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NormEncoderRS16();
|
||||||
|
~NormEncoderRS16();
|
||||||
|
|
||||||
|
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize);
|
||||||
|
virtual void Destroy();
|
||||||
|
virtual void Encode(unsigned int segmentId, const char* dataVector, char** parityVectorList);
|
||||||
|
|
||||||
|
unsigned int GetNumData()
|
||||||
|
{return ndata;}
|
||||||
|
unsigned int GetNumParity()
|
||||||
|
{return npar;}
|
||||||
|
unsigned int GetVectorSize()
|
||||||
|
{return vector_size;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned int ndata; // max data pkts per block (k)
|
||||||
|
unsigned int npar; // No. of parity packets (n-k)
|
||||||
|
unsigned int vector_size; // Size of biggest vector to encode
|
||||||
|
UINT8* enc_matrix;
|
||||||
|
unsigned int enc_index;
|
||||||
|
|
||||||
|
}; // end class NormEncoderRS16
|
||||||
|
|
||||||
|
|
||||||
|
class NormDecoderRS16 : public NormDecoder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NormDecoderRS16();
|
||||||
|
virtual ~NormDecoderRS16();
|
||||||
|
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize);
|
||||||
|
virtual void Destroy();
|
||||||
|
virtual int Decode(char** vectorList, unsigned int numData, unsigned int erasureCount, unsigned int* erasureLocs);
|
||||||
|
|
||||||
|
unsigned int GetNumParity()
|
||||||
|
{return npar;}
|
||||||
|
unsigned int GetVectorSize()
|
||||||
|
{return vector_size;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool InvertDecodingMatrix(); // used in Decode() method
|
||||||
|
|
||||||
|
unsigned int ndata; // max data pkts per block (k)
|
||||||
|
unsigned int npar; // No. of parity packets (n-k)
|
||||||
|
UINT16 vector_size; // Size of biggest vector to encode
|
||||||
|
UINT8* enc_matrix;
|
||||||
|
UINT8* dec_matrix;
|
||||||
|
unsigned int* parity_loc;
|
||||||
|
|
||||||
|
// These "inv_" members are used in InvertDecodingMatrix()
|
||||||
|
unsigned int* inv_ndxc;
|
||||||
|
unsigned int* inv_ndxr;
|
||||||
|
unsigned int* inv_pivt;
|
||||||
|
UINT8* inv_id_row;
|
||||||
|
UINT8* inv_temp_row;
|
||||||
|
|
||||||
|
}; // end class NormDecoderRS16
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _NORM_ENCODER_RS16
|
||||||
|
|
@ -0,0 +1,69 @@
|
||||||
|
#ifndef _NORM_ENCODER_RS8
|
||||||
|
#define _NORM_ENCODER_RS8
|
||||||
|
|
||||||
|
#include "normEncoder.h"
|
||||||
|
#include "protoDefs.h" // for UINT16
|
||||||
|
|
||||||
|
class NormEncoderRS8 : public NormEncoder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NormEncoderRS8();
|
||||||
|
~NormEncoderRS8();
|
||||||
|
|
||||||
|
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize);
|
||||||
|
virtual void Destroy();
|
||||||
|
virtual void Encode(unsigned int segmentId, const char* dataVector, char** parityVectorList);
|
||||||
|
|
||||||
|
unsigned int GetNumData()
|
||||||
|
{return ndata;}
|
||||||
|
unsigned int GetNumParity()
|
||||||
|
{return npar;}
|
||||||
|
unsigned int GetVectorSize()
|
||||||
|
{return vector_size;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned int ndata; // max data pkts per block (k)
|
||||||
|
unsigned int npar; // No. of parity packets (n-k)
|
||||||
|
unsigned int vector_size; // Size of biggest vector to encode
|
||||||
|
UINT8* enc_matrix;
|
||||||
|
|
||||||
|
}; // end class NormEncoder
|
||||||
|
|
||||||
|
|
||||||
|
class NormDecoderRS8 : public NormDecoder
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NormDecoderRS8();
|
||||||
|
virtual ~NormDecoderRS8();
|
||||||
|
virtual bool Init(unsigned int numData, unsigned int numParity, UINT16 vectorSize);
|
||||||
|
virtual void Destroy();
|
||||||
|
virtual int Decode(char** vectorList, unsigned int numData, unsigned int erasureCount, unsigned int* erasureLocs);
|
||||||
|
|
||||||
|
unsigned int GetNumParity()
|
||||||
|
{return npar;}
|
||||||
|
unsigned int GetVectorSize()
|
||||||
|
{return vector_size;}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool InvertDecodingMatrix(); // used in Decode() method
|
||||||
|
|
||||||
|
unsigned int ndata; // max data pkts per block (k)
|
||||||
|
unsigned int npar; // No. of parity packets (n-k)
|
||||||
|
UINT16 vector_size; // Size of biggest vector to encode
|
||||||
|
UINT8* enc_matrix;
|
||||||
|
UINT8* dec_matrix;
|
||||||
|
unsigned int* parity_loc;
|
||||||
|
|
||||||
|
// These "inv_" members are used in InvertDecodingMatrix()
|
||||||
|
unsigned int* inv_ndxc;
|
||||||
|
unsigned int* inv_ndxr;
|
||||||
|
unsigned int* inv_pivt;
|
||||||
|
UINT8* inv_id_row;
|
||||||
|
UINT8* inv_temp_row;
|
||||||
|
|
||||||
|
}; // end class NormDecoder
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // _NORM_ENCODER_RS8
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -27,6 +27,27 @@ class NormNode
|
||||||
void SetId(const NormNodeId& nodeId) {id = nodeId;}
|
void SetId(const NormNodeId& nodeId) {id = nodeId;}
|
||||||
inline const NormNodeId& LocalNodeId() const;
|
inline const NormNodeId& LocalNodeId() const;
|
||||||
|
|
||||||
|
class Accumulator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Accumulator();
|
||||||
|
void Reset()
|
||||||
|
{msb = lsb = 0;}
|
||||||
|
void Increment(unsigned long count)
|
||||||
|
{
|
||||||
|
unsigned long lsbOld = lsb;
|
||||||
|
lsb += count;
|
||||||
|
if (lsb < lsbOld) msb++;
|
||||||
|
}
|
||||||
|
double GetValue() const
|
||||||
|
{return ((((double)0xffffffff)*msb) + lsb);}
|
||||||
|
double GetScaledValue(double factor) const
|
||||||
|
{return ((((double)0xffffffff)*(factor*msb)) + (factor*lsb));}
|
||||||
|
private:
|
||||||
|
unsigned long msb;
|
||||||
|
unsigned long lsb;
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
class NormSession& session;
|
class NormSession& session;
|
||||||
|
|
||||||
|
|
@ -49,7 +70,8 @@ class NormLossEstimator
|
||||||
bool Update(const struct timeval& currentTime,
|
bool Update(const struct timeval& currentTime,
|
||||||
unsigned short seqNumber,
|
unsigned short seqNumber,
|
||||||
bool ecn = false);
|
bool ecn = false);
|
||||||
void SetLossEventWindow(double lossWindow) {event_window = lossWindow;}
|
void SetLossEventWindow(double lossWindow)
|
||||||
|
{event_window = lossWindow;}
|
||||||
void SetInitialLoss(double lossFraction)
|
void SetInitialLoss(double lossFraction)
|
||||||
{
|
{
|
||||||
memset(history, 0, (DEPTH+1)*sizeof(unsigned int));
|
memset(history, 0, (DEPTH+1)*sizeof(unsigned int));
|
||||||
|
|
@ -83,16 +105,12 @@ class NormLossEstimator2
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NormLossEstimator2();
|
NormLossEstimator2();
|
||||||
void SetEventWindow(unsigned short windowDepth)
|
|
||||||
{event_window = windowDepth;}
|
|
||||||
void SetLossEventWindow(double theTime)
|
void SetLossEventWindow(double theTime)
|
||||||
{event_window_time = theTime;}
|
{event_window = theTime;}
|
||||||
bool Update(const struct timeval& currentTime,
|
bool Update(const struct timeval& currentTime,
|
||||||
unsigned short seqNumber,
|
unsigned short seqNumber,
|
||||||
bool ecn = false);
|
bool ecn = false);
|
||||||
double LossFraction();
|
double LossFraction();
|
||||||
|
|
||||||
bool NoLoss() {return no_loss;}
|
|
||||||
void SetInitialLoss(double lossFraction)
|
void SetInitialLoss(double lossFraction)
|
||||||
{
|
{
|
||||||
memset(history, 0, (DEPTH+1)*sizeof(unsigned int));
|
memset(history, 0, (DEPTH+1)*sizeof(unsigned int));
|
||||||
|
|
@ -101,23 +119,34 @@ class NormLossEstimator2
|
||||||
unsigned long CurrentLossInterval() {return history[0];}
|
unsigned long CurrentLossInterval() {return history[0];}
|
||||||
unsigned int LastLossInterval() {return history[1];}
|
unsigned int LastLossInterval() {return history[1];}
|
||||||
|
|
||||||
|
void SetIgnoreLoss(bool state)
|
||||||
|
{ignore_loss = state;}
|
||||||
|
void SetTolerateLoss(bool state)
|
||||||
|
{tolerate_loss = state;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum {DEPTH = 8};
|
enum {DEPTH = 8};
|
||||||
|
|
||||||
|
enum LossEventStatus
|
||||||
|
{
|
||||||
|
|
||||||
|
CONFIRMED = 0,
|
||||||
|
CONFIRMING = 1,
|
||||||
|
SEEKING = 2
|
||||||
|
};
|
||||||
// Members
|
// Members
|
||||||
bool init;
|
bool init;
|
||||||
|
bool ignore_loss;
|
||||||
|
bool tolerate_loss;
|
||||||
unsigned long lag_mask;
|
unsigned long lag_mask;
|
||||||
unsigned int lag_depth;
|
unsigned int lag_depth;
|
||||||
unsigned long lag_test_bit;
|
unsigned long lag_test_bit;
|
||||||
unsigned short lag_index;
|
unsigned short lag_index;
|
||||||
|
|
||||||
unsigned short event_window;
|
double event_window;
|
||||||
unsigned short event_index;
|
struct timeval event_time;
|
||||||
double event_window_time;
|
struct timeval event_time_orig; // (TBD - remove this, it's not used);
|
||||||
double event_index_time;
|
LossEventStatus seeking_loss_event;
|
||||||
bool seeking_loss_event;
|
|
||||||
|
|
||||||
bool no_loss;
|
|
||||||
double initial_loss;
|
|
||||||
|
|
||||||
unsigned long history[9]; // loss interval history
|
unsigned long history[9]; // loss interval history
|
||||||
double discount[9];
|
double discount[9];
|
||||||
|
|
@ -128,6 +157,7 @@ class NormLossEstimator2
|
||||||
{init = true; Sync(theSequence);}
|
{init = true; Sync(theSequence);}
|
||||||
void Sync(unsigned short theSequence)
|
void Sync(unsigned short theSequence)
|
||||||
{lag_index = theSequence;}
|
{lag_index = theSequence;}
|
||||||
|
|
||||||
void ChangeLagDepth(unsigned int theDepth)
|
void ChangeLagDepth(unsigned int theDepth)
|
||||||
{
|
{
|
||||||
theDepth = (theDepth > 20) ? 20 : theDepth;
|
theDepth = (theDepth > 20) ? 20 : theDepth;
|
||||||
|
|
@ -177,6 +207,8 @@ class NormCCNode : public NormNode
|
||||||
bool HasRtt() const {return rtt_confirmed;}
|
bool HasRtt() const {return rtt_confirmed;}
|
||||||
|
|
||||||
double GetRtt() const {return rtt;}
|
double GetRtt() const {return rtt;}
|
||||||
|
double GetRttSample() const {return rtt_sample;}
|
||||||
|
double GetRttSqMean() const {return rtt_sqmean;}
|
||||||
double GetLoss() const {return loss;}
|
double GetLoss() const {return loss;}
|
||||||
double GetRate() const {return rate;}
|
double GetRate() const {return rate;}
|
||||||
UINT16 GetCCSequence() const {return cc_sequence;}
|
UINT16 GetCCSequence() const {return cc_sequence;}
|
||||||
|
|
@ -188,10 +220,16 @@ class NormCCNode : public NormNode
|
||||||
void SetClrStatus(bool state) {is_clr = state;}
|
void SetClrStatus(bool state) {is_clr = state;}
|
||||||
void SetPlrStatus(bool state) {is_plr = state;}
|
void SetPlrStatus(bool state) {is_plr = state;}
|
||||||
void SetRttStatus(bool state) {rtt_confirmed = state;}
|
void SetRttStatus(bool state) {rtt_confirmed = state;}
|
||||||
void SetRtt(double value) {rtt = value;}
|
void SetRtt(double value)
|
||||||
|
{
|
||||||
|
rtt_sqmean = sqrt(value);
|
||||||
|
rtt = rtt_sample = value;
|
||||||
|
}
|
||||||
double UpdateRtt(double value)
|
double UpdateRtt(double value)
|
||||||
{
|
{
|
||||||
rtt = 0.9*rtt + 0.1 * value;
|
rtt_sample = value; // save last rtt sample
|
||||||
|
rtt_sqmean = 0.9*rtt_sqmean + 0.1*sqrt(value);
|
||||||
|
rtt = 0.9*rtt + 0.1*value;
|
||||||
return rtt;
|
return rtt;
|
||||||
}
|
}
|
||||||
void SetLoss(double value) {loss = value;}
|
void SetLoss(double value) {loss = value;}
|
||||||
|
|
@ -205,20 +243,35 @@ class NormCCNode : public NormNode
|
||||||
bool is_active;
|
bool is_active;
|
||||||
struct timeval feedback_time; // time of last received feedback
|
struct timeval feedback_time; // time of last received feedback
|
||||||
double rtt; // in seconds
|
double rtt; // in seconds
|
||||||
|
|
||||||
|
|
||||||
|
double rtt_sqmean; // ave sqrt(rtt), EWMA smoothed
|
||||||
|
double rtt_sample; // last rtt sample value
|
||||||
|
|
||||||
double loss; // loss fraction
|
double loss; // loss fraction
|
||||||
double rate; // in bytes per second
|
double rate; // in bytes per second
|
||||||
UINT16 cc_sequence;
|
UINT16 cc_sequence;
|
||||||
}; // end class NormCCNode
|
}; // end class NormCCNode
|
||||||
|
|
||||||
class NormServerNode : public NormNode
|
class NormSenderNode : public NormNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum ObjectStatus {OBJ_INVALID, OBJ_NEW, OBJ_PENDING, OBJ_COMPLETE};
|
enum ObjectStatus {OBJ_INVALID, OBJ_NEW, OBJ_PENDING, OBJ_COMPLETE};
|
||||||
|
|
||||||
enum RepairBoundary {BLOCK_BOUNDARY, OBJECT_BOUNDARY};
|
enum RepairBoundary {BLOCK_BOUNDARY, OBJECT_BOUNDARY};
|
||||||
|
|
||||||
NormServerNode(class NormSession& theSession, NormNodeId nodeId);
|
|
||||||
~NormServerNode();
|
enum SyncPolicy
|
||||||
|
{
|
||||||
|
SYNC_CURRENT, // sync to detect transmit point, iff NORM_DATA from first FEC block
|
||||||
|
SYNC_ALL // permiscuously sync as far back as possible
|
||||||
|
};
|
||||||
|
|
||||||
|
NormSenderNode(class NormSession& theSession, NormNodeId nodeId);
|
||||||
|
~NormSenderNode();
|
||||||
|
|
||||||
|
void SetInstanceId(UINT16 instanceId)
|
||||||
|
{instance_id = instanceId;}
|
||||||
|
|
||||||
// Parameters
|
// Parameters
|
||||||
NormObject::NackingMode GetDefaultNackingMode() const
|
NormObject::NackingMode GetDefaultNackingMode() const
|
||||||
|
|
@ -229,12 +282,17 @@ class NormServerNode : public NormNode
|
||||||
// Should generally inherit NormSession::GetRxRobustFactor()
|
// Should generally inherit NormSession::GetRxRobustFactor()
|
||||||
void SetRobustFactor(int value);
|
void SetRobustFactor(int value);
|
||||||
|
|
||||||
NormServerNode::RepairBoundary GetRepairBoundary() const
|
RepairBoundary GetRepairBoundary() const
|
||||||
{return repair_boundary;}
|
{return repair_boundary;}
|
||||||
// (TBD) force an appropriate RepairCheck on boundary change???
|
// (TBD) force an appropriate RepairCheck on boundary change???
|
||||||
void SetRepairBoundary(RepairBoundary repairBoundary)
|
void SetRepairBoundary(RepairBoundary repairBoundary)
|
||||||
{repair_boundary = repairBoundary;}
|
{repair_boundary = repairBoundary;}
|
||||||
|
|
||||||
|
SyncPolicy GetSyncPolicy() const
|
||||||
|
{return sync_policy;}
|
||||||
|
void SetSyncPolicy(SyncPolicy syncPolicy)
|
||||||
|
{sync_policy = syncPolicy;}
|
||||||
|
|
||||||
bool UnicastNacks() {return unicast_nacks;}
|
bool UnicastNacks() {return unicast_nacks;}
|
||||||
void SetUnicastNacks(bool state) {unicast_nacks = state;}
|
void SetUnicastNacks(bool state) {unicast_nacks = state;}
|
||||||
|
|
||||||
|
|
@ -247,6 +305,8 @@ class NormServerNode : public NormNode
|
||||||
bool ecnStatus = false);
|
bool ecnStatus = false);
|
||||||
double LossEstimate() {return loss_estimator.LossFraction();}
|
double LossEstimate() {return loss_estimator.LossFraction();}
|
||||||
|
|
||||||
|
void CheckCCFeedback();
|
||||||
|
|
||||||
void UpdateRecvRate(const struct timeval& currentTime,
|
void UpdateRecvRate(const struct timeval& currentTime,
|
||||||
unsigned short msgSize);
|
unsigned short msgSize);
|
||||||
|
|
||||||
|
|
@ -262,7 +322,7 @@ class NormServerNode : public NormNode
|
||||||
UINT16 GetInstanceId() {return instance_id;}
|
UINT16 GetInstanceId() {return instance_id;}
|
||||||
bool IsOpen() const {return is_open;}
|
bool IsOpen() const {return is_open;}
|
||||||
void Close();
|
void Close();
|
||||||
bool AllocateBuffers(UINT16 segmentSize, UINT16 numData, UINT16 numParity);
|
bool AllocateBuffers(UINT8 fecId, UINT16 fecInstanceId, UINT8 fecM, UINT16 segmentSize, UINT16 numData, UINT16 numParity);
|
||||||
bool BuffersAllocated() {return (0 != segment_size);}
|
bool BuffersAllocated() {return (0 != segment_size);}
|
||||||
void FreeBuffers();
|
void FreeBuffers();
|
||||||
void Activate(bool isObjectMsg);
|
void Activate(bool isObjectMsg);
|
||||||
|
|
@ -272,21 +332,25 @@ class NormServerNode : public NormNode
|
||||||
ObjectStatus UpdateSyncStatus(const NormObjectId& objectId);
|
ObjectStatus UpdateSyncStatus(const NormObjectId& objectId);
|
||||||
ObjectStatus GetObjectStatus(const NormObjectId& objectId) const;
|
ObjectStatus GetObjectStatus(const NormObjectId& objectId) const;
|
||||||
|
|
||||||
bool GetFirstPending(NormObjectId& objectId)
|
|
||||||
|
UINT8 GetFecFieldSize() const
|
||||||
|
{return fec_m;}
|
||||||
|
|
||||||
|
bool GetFirstPending(NormObjectId& objectId) const
|
||||||
{
|
{
|
||||||
UINT32 index;
|
UINT32 index;
|
||||||
bool result = rx_pending_mask.GetFirstSet(index);
|
bool result = rx_pending_mask.GetFirstSet(index);
|
||||||
objectId = (UINT16)index;
|
objectId = (UINT16)index;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
bool GetNextPending(NormObjectId& objectId)
|
bool GetNextPending(NormObjectId& objectId) const
|
||||||
{
|
{
|
||||||
UINT32 index = (UINT16)objectId;
|
UINT32 index = (UINT16)objectId;
|
||||||
bool result = rx_pending_mask.GetNextSet(index);
|
bool result = rx_pending_mask.GetNextSet(index);
|
||||||
objectId = (UINT16)index;
|
objectId = (UINT16)index;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
bool GetLastPending(NormObjectId& objectId)
|
bool GetLastPending(NormObjectId& objectId) const
|
||||||
{
|
{
|
||||||
UINT32 index;
|
UINT32 index;
|
||||||
bool result = rx_pending_mask.GetLastSet(index);
|
bool result = rx_pending_mask.GetLastSet(index);
|
||||||
|
|
@ -347,18 +411,37 @@ class NormServerNode : public NormNode
|
||||||
void CalculateGrttResponse(const struct timeval& currentTime,
|
void CalculateGrttResponse(const struct timeval& currentTime,
|
||||||
struct timeval& grttResponse) const;
|
struct timeval& grttResponse) const;
|
||||||
|
|
||||||
// Statistics kept on server
|
// Statistics kept on sender
|
||||||
unsigned long CurrentBufferUsage() const
|
unsigned long CurrentBufferUsage() const
|
||||||
{return (segment_size * segment_pool.CurrentUsage());}
|
{return (segment_size * segment_pool.CurrentUsage());}
|
||||||
unsigned long PeakBufferUsage() const
|
unsigned long PeakBufferUsage() const
|
||||||
{return (segment_size * segment_pool.PeakUsage());}
|
{return (segment_size * segment_pool.PeakUsage());}
|
||||||
unsigned long BufferOverunCount() const
|
unsigned long BufferOverunCount() const
|
||||||
{return segment_pool.OverunCount() + block_pool.OverrunCount();}
|
{return segment_pool.OverunCount() + block_pool.OverrunCount();}
|
||||||
unsigned long RecvTotal() const {return recv_total;}
|
|
||||||
unsigned long RecvGoodput() const {return recv_goodput;}
|
unsigned long CurrentStreamBufferUsage() const;
|
||||||
void IncrementRecvTotal(unsigned long count) {recv_total += count;}
|
unsigned long PeakStreamBufferUsage() const;
|
||||||
void IncrementRecvGoodput(unsigned long count) {recv_goodput += count;}
|
unsigned long StreamBufferOverunCount() const;
|
||||||
void ResetRecvStats() {recv_total = recv_goodput = 0;}
|
|
||||||
|
|
||||||
|
//unsigned long RecvTotal() const {return recv_total;}
|
||||||
|
//unsigned long RecvGoodput() const {return recv_goodput;}
|
||||||
|
|
||||||
|
// returns ave bytes/sec
|
||||||
|
double GetRecvRate(double interval) const
|
||||||
|
{return recv_total.GetScaledValue(1.0 / interval);}
|
||||||
|
double GetRecvGoodput(double interval) const
|
||||||
|
{return recv_goodput.GetScaledValue(1.0 / interval);}
|
||||||
|
|
||||||
|
void IncrementRecvTotal(unsigned long count)
|
||||||
|
{recv_total.Increment(count);}
|
||||||
|
void IncrementRecvGoodput(unsigned long count)
|
||||||
|
{recv_goodput.Increment(count);}
|
||||||
|
void ResetRecvStats()
|
||||||
|
{
|
||||||
|
recv_total.Reset();
|
||||||
|
recv_goodput.Reset();
|
||||||
|
}
|
||||||
void IncrementResyncCount() {resync_count++;}
|
void IncrementResyncCount() {resync_count++;}
|
||||||
unsigned long ResyncCount() const {return resync_count;}
|
unsigned long ResyncCount() const {return resync_count;}
|
||||||
unsigned long NackCount() const {return nack_count;}
|
unsigned long NackCount() const {return nack_count;}
|
||||||
|
|
@ -367,6 +450,41 @@ class NormServerNode : public NormNode
|
||||||
unsigned long PendingCount() const {return rx_table.GetCount();}
|
unsigned long PendingCount() const {return rx_table.GetCount();}
|
||||||
unsigned long FailureCount() const {return failure_count;}
|
unsigned long FailureCount() const {return failure_count;}
|
||||||
|
|
||||||
|
class CmdBuffer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CmdBuffer();
|
||||||
|
~CmdBuffer();
|
||||||
|
|
||||||
|
enum {CMD_SIZE_MAX = 8192};
|
||||||
|
|
||||||
|
void SetContent(const char* data, unsigned int numBytes)
|
||||||
|
{
|
||||||
|
ASSERT(numBytes <= CMD_SIZE_MAX);
|
||||||
|
memcpy(buffer, data, numBytes);
|
||||||
|
length = numBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* GetContent() const
|
||||||
|
{return buffer;}
|
||||||
|
unsigned int GetContentLength() const
|
||||||
|
{return length;}
|
||||||
|
|
||||||
|
void Append(CmdBuffer* nextBuffer)
|
||||||
|
{next = nextBuffer;}
|
||||||
|
CmdBuffer* GetNext() const
|
||||||
|
{return next;}
|
||||||
|
private:
|
||||||
|
char buffer[CMD_SIZE_MAX];
|
||||||
|
unsigned length;
|
||||||
|
CmdBuffer* next; // to support singly-linked list
|
||||||
|
}; // end class NormSenderNode::CmdBuffer
|
||||||
|
|
||||||
|
CmdBuffer* NewCmdBuffer() const;
|
||||||
|
|
||||||
|
bool ReadNextCmd(char* buffer, unsigned int* buflen);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const double DEFAULT_NOMINAL_INTERVAL;
|
static const double DEFAULT_NOMINAL_INTERVAL;
|
||||||
|
|
@ -390,6 +508,7 @@ class NormServerNode : public NormNode
|
||||||
|
|
||||||
UINT16 instance_id;
|
UINT16 instance_id;
|
||||||
int robust_factor;
|
int robust_factor;
|
||||||
|
SyncPolicy sync_policy;
|
||||||
bool synchronized;
|
bool synchronized;
|
||||||
NormObjectId sync_id; // only valid if(synchronized)
|
NormObjectId sync_id; // only valid if(synchronized)
|
||||||
NormObjectId next_id; // only valid if(synchronized)
|
NormObjectId next_id; // only valid if(synchronized)
|
||||||
|
|
@ -399,6 +518,8 @@ class NormServerNode : public NormNode
|
||||||
|
|
||||||
bool is_open;
|
bool is_open;
|
||||||
UINT16 segment_size;
|
UINT16 segment_size;
|
||||||
|
UINT8 fec_id;
|
||||||
|
UINT8 fec_m;
|
||||||
unsigned int ndata;
|
unsigned int ndata;
|
||||||
unsigned int nparity;
|
unsigned int nparity;
|
||||||
|
|
||||||
|
|
@ -416,7 +537,7 @@ class NormServerNode : public NormNode
|
||||||
char** retrieval_pool;
|
char** retrieval_pool;
|
||||||
unsigned int retrieval_index;
|
unsigned int retrieval_index;
|
||||||
|
|
||||||
bool server_active;
|
bool sender_active;
|
||||||
ProtoTimer activity_timer;
|
ProtoTimer activity_timer;
|
||||||
ProtoTimer repair_timer;
|
ProtoTimer repair_timer;
|
||||||
|
|
||||||
|
|
@ -426,7 +547,7 @@ class NormServerNode : public NormNode
|
||||||
NormBlockId watermark_block_id;
|
NormBlockId watermark_block_id;
|
||||||
NormSegmentId watermark_segment_id;
|
NormSegmentId watermark_segment_id;
|
||||||
|
|
||||||
// Remote server grtt measurement state
|
// Remote sender grtt measurement state
|
||||||
double grtt_estimate;
|
double grtt_estimate;
|
||||||
UINT8 grtt_quantized;
|
UINT8 grtt_quantized;
|
||||||
struct timeval grtt_send_time;
|
struct timeval grtt_send_time;
|
||||||
|
|
@ -435,10 +556,11 @@ class NormServerNode : public NormNode
|
||||||
UINT8 gsize_quantized;
|
UINT8 gsize_quantized;
|
||||||
double backoff_factor;
|
double backoff_factor;
|
||||||
|
|
||||||
// Remote server congestion control state
|
// Remote sender congestion control state
|
||||||
NormLossEstimator2 loss_estimator;
|
NormLossEstimator2 loss_estimator;
|
||||||
UINT16 cc_sequence;
|
UINT16 cc_sequence;
|
||||||
bool cc_enable;
|
bool cc_enable;
|
||||||
|
bool cc_feedback_needed;
|
||||||
double cc_rate; // ccRate at start of cc_timer
|
double cc_rate; // ccRate at start of cc_timer
|
||||||
ProtoTimer cc_timer;
|
ProtoTimer cc_timer;
|
||||||
double rtt_estimate;
|
double rtt_estimate;
|
||||||
|
|
@ -449,20 +571,26 @@ class NormServerNode : public NormNode
|
||||||
bool slow_start;
|
bool slow_start;
|
||||||
double send_rate; // sender advertised rate
|
double send_rate; // sender advertised rate
|
||||||
double recv_rate; // measured recv rate
|
double recv_rate; // measured recv rate
|
||||||
|
double recv_rate_prev; // for recv_rate measurement
|
||||||
struct timeval prev_update_time; // for recv_rate measurement
|
struct timeval prev_update_time; // for recv_rate measurement
|
||||||
unsigned long recv_accumulator; // for recv_rate measurement
|
Accumulator recv_accumulator; // for recv_rate measurement
|
||||||
double nominal_packet_size;
|
double nominal_packet_size;
|
||||||
|
|
||||||
|
// Buffering of app-defined commands received from Remote sender
|
||||||
|
CmdBuffer* cmd_buffer_head; // the oldest received command is here (for FIFO)
|
||||||
|
CmdBuffer* cmd_buffer_tail; // newly-received commands appended here
|
||||||
|
CmdBuffer* cmd_buffer_pool; // we "pool" allocated buffers for possible reuse here
|
||||||
|
|
||||||
// For statistics tracking
|
// For statistics tracking
|
||||||
unsigned long recv_total; // total recvd accumulator
|
Accumulator recv_total; // total recvd accumulator
|
||||||
unsigned long recv_goodput; // goodput recvd accumulator
|
Accumulator recv_goodput; // goodput recvd accumulator
|
||||||
unsigned long resync_count;
|
unsigned long resync_count;
|
||||||
unsigned long nack_count;
|
unsigned long nack_count;
|
||||||
unsigned long suppress_count;
|
unsigned long suppress_count;
|
||||||
unsigned long completion_count;
|
unsigned long completion_count;
|
||||||
unsigned long failure_count; // usually due to re-syncs
|
unsigned long failure_count; // usually due to re-syncs
|
||||||
|
|
||||||
}; // end class NormServerNode
|
}; // end class NormSenderNode
|
||||||
|
|
||||||
|
|
||||||
// Used for binary trees of NormNodes
|
// Used for binary trees of NormNodes
|
||||||
|
|
@ -488,8 +616,8 @@ class NormNodeTree
|
||||||
class NormNodeTreeIterator
|
class NormNodeTreeIterator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NormNodeTreeIterator(const NormNodeTree& nodeTree);
|
NormNodeTreeIterator(const NormNodeTree& nodeTree, NormNode* prevNode = NULL);
|
||||||
void Reset();
|
void Reset(NormNode* prevNode = NULL);
|
||||||
NormNode* GetNextNode();
|
NormNode* GetNextNode();
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -512,7 +640,7 @@ class NormNodeList
|
||||||
void Remove(NormNode* theNode);
|
void Remove(NormNode* theNode);
|
||||||
void DeleteNode(NormNode* theNode)
|
void DeleteNode(NormNode* theNode)
|
||||||
{
|
{
|
||||||
ASSERT(theNode);
|
ASSERT(NULL != theNode);
|
||||||
Remove(theNode);
|
Remove(theNode);
|
||||||
theNode->Release();
|
theNode->Release();
|
||||||
}
|
}
|
||||||
|
|
@ -61,8 +61,8 @@ class NormObject
|
||||||
|
|
||||||
class NormSession& GetSession() const {return session;}
|
class NormSession& GetSession() const {return session;}
|
||||||
NormNodeId LocalNodeId() const;
|
NormNodeId LocalNodeId() const;
|
||||||
class NormServerNode* GetServer() const {return server;}
|
class NormSenderNode* GetSender() const {return sender;}
|
||||||
NormNodeId GetServerNodeId() const;
|
NormNodeId GetSenderNodeId() const;
|
||||||
|
|
||||||
bool IsOpen() {return (0 != segment_size);}
|
bool IsOpen() {return (0 != segment_size);}
|
||||||
// Opens (inits) object for tx operation
|
// Opens (inits) object for tx operation
|
||||||
|
|
@ -70,17 +70,21 @@ class NormObject
|
||||||
const char* infoPtr,
|
const char* infoPtr,
|
||||||
UINT16 infoLen,
|
UINT16 infoLen,
|
||||||
UINT16 segmentSize,
|
UINT16 segmentSize,
|
||||||
|
UINT8 fecId,
|
||||||
|
UINT8 fecM,
|
||||||
UINT16 numData,
|
UINT16 numData,
|
||||||
UINT16 numParity);
|
UINT16 numParity);
|
||||||
// Opens (inits) object for rx operation
|
// Opens (inits) object for rx operation
|
||||||
bool Open(const NormObjectSize& objectSize,
|
bool RxOpen(const NormObjectSize& objectSize,
|
||||||
bool hasInfo,
|
bool hasInfo,
|
||||||
UINT16 segmentSize,
|
UINT16 segmentSize,
|
||||||
|
UINT8 fecId,
|
||||||
|
UINT8 fecM,
|
||||||
UINT16 numData,
|
UINT16 numData,
|
||||||
UINT16 numParity)
|
UINT16 numParity)
|
||||||
{
|
{
|
||||||
return Open(objectSize, (char*)NULL, hasInfo ? 1 : 0,
|
return Open(objectSize, (char*)NULL, hasInfo ? 1 : 0,
|
||||||
segmentSize, numData, numParity);
|
segmentSize, fecId, fecM, numData, numParity);
|
||||||
}
|
}
|
||||||
void Close();
|
void Close();
|
||||||
|
|
||||||
|
|
@ -101,7 +105,7 @@ class NormObject
|
||||||
void SetNackingMode(NackingMode nackingMode)
|
void SetNackingMode(NackingMode nackingMode)
|
||||||
{
|
{
|
||||||
nacking_mode = nackingMode;
|
nacking_mode = nackingMode;
|
||||||
// (TBD) initiate an appropriate NormServerNode::RepairCheck
|
// (TBD) initiate an appropriate NormSenderNode::RepairCheck
|
||||||
// to prompt repair process if needed
|
// to prompt repair process if needed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -166,9 +170,9 @@ class NormObject
|
||||||
|
|
||||||
bool FindRepairIndex(NormBlockId& blockId, NormSegmentId& segmentId) const;
|
bool FindRepairIndex(NormBlockId& blockId, NormSegmentId& segmentId) const;
|
||||||
|
|
||||||
// Methods available to server for transmission
|
// Methods available to sender for transmission
|
||||||
bool NextServerMsg(NormObjectMsg* msg);
|
bool NextSenderMsg(NormObjectMsg* msg);
|
||||||
NormBlock* ServerRecoverBlock(NormBlockId blockId);
|
NormBlock* SenderRecoverBlock(NormBlockId blockId);
|
||||||
bool CalculateBlockParity(NormBlock* block);
|
bool CalculateBlockParity(NormBlock* block);
|
||||||
|
|
||||||
/*bool IsFirstPass() {return first_pass;}
|
/*bool IsFirstPass() {return first_pass;}
|
||||||
|
|
@ -189,9 +193,8 @@ class NormObject
|
||||||
result = result ? pending_mask.Set(blockId) : false;
|
result = result ? pending_mask.Set(blockId) : false;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
bool HandleInfoRequest();
|
bool HandleInfoRequest(bool holdoff);
|
||||||
bool HandleBlockRequest(NormBlockId nextId, NormBlockId lastId);
|
bool HandleBlockRequest(NormBlockId nextId, NormBlockId lastId);
|
||||||
bool SetPending(NormBlockId blockId) {return pending_mask.Set(blockId);}
|
|
||||||
NormBlock* FindBlock(NormBlockId blockId) {return block_buffer.Find(blockId);}
|
NormBlock* FindBlock(NormBlockId blockId) {return block_buffer.Find(blockId);}
|
||||||
bool ActivateRepairs();
|
bool ActivateRepairs();
|
||||||
bool IsRepairSet(NormBlockId blockId) {return repair_mask.Test(blockId);}
|
bool IsRepairSet(NormBlockId blockId) {return repair_mask.Test(blockId);}
|
||||||
|
|
@ -205,7 +208,7 @@ class NormObject
|
||||||
NormBlock* StealNonPendingBlock(bool excludeBlock, NormBlockId excludeId = 0);
|
NormBlock* StealNonPendingBlock(bool excludeBlock, NormBlockId excludeId = 0);
|
||||||
|
|
||||||
|
|
||||||
// Methods available to client for reception
|
// Methods available to receiver for reception
|
||||||
bool Accepted() {return accepted;}
|
bool Accepted() {return accepted;}
|
||||||
void HandleObjectMessage(const NormObjectMsg& msg,
|
void HandleObjectMessage(const NormObjectMsg& msg,
|
||||||
NormMsg::Type msgType,
|
NormMsg::Type msgType,
|
||||||
|
|
@ -219,42 +222,53 @@ class NormObject
|
||||||
bool ReclaimSourceSegments(NormSegmentPool& segmentPool);
|
bool ReclaimSourceSegments(NormSegmentPool& segmentPool);
|
||||||
bool PassiveRepairCheck(NormBlockId blockId,
|
bool PassiveRepairCheck(NormBlockId blockId,
|
||||||
NormSegmentId segmentId);
|
NormSegmentId segmentId);
|
||||||
bool ClientRepairCheck(CheckLevel level,
|
bool ReceiverRepairCheck(CheckLevel level,
|
||||||
NormBlockId blockId,
|
NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
bool timerActive,
|
bool timerActive,
|
||||||
bool holdoffPhase = false);
|
bool holdoffPhase = false);
|
||||||
|
bool ReceiverRewindCheck(NormBlockId blockId,
|
||||||
|
NormSegmentId segmentId);
|
||||||
bool IsRepairPending(bool flush);
|
bool IsRepairPending(bool flush);
|
||||||
bool AppendRepairRequest(NormNackMsg& nack, bool flush);
|
bool AppendRepairRequest(NormNackMsg& nack, bool flush);
|
||||||
void SetRepairInfo() {repair_info = true;}
|
void SetRepairInfo() {repair_info = true;}
|
||||||
bool SetRepairs(NormBlockId first, NormBlockId last)
|
bool SetRepairs(NormBlockId first, NormBlockId last)
|
||||||
{
|
{
|
||||||
return (first == last) ? repair_mask.Set(first) :
|
return (first == last) ? repair_mask.Set(first) :
|
||||||
repair_mask.SetBits(first, last-first+1);
|
repair_mask.SetBits(first, repair_mask.Delta(last,first)+1);
|
||||||
}
|
}
|
||||||
|
void SetLastNackTime(const ProtoTime& theTime)
|
||||||
|
{last_nack_time = theTime;}
|
||||||
|
const ProtoTime& GetLastNackTime() const
|
||||||
|
{return last_nack_time;}
|
||||||
|
|
||||||
|
double GetNackAge() const
|
||||||
|
{return ProtoTime::Delta(ProtoTime().GetCurrentTime(), last_nack_time);}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
NormObject(Type theType,
|
NormObject(Type theType,
|
||||||
class NormSession& theSession,
|
class NormSession& theSession,
|
||||||
class NormServerNode* theServer,
|
class NormSenderNode* theSender,
|
||||||
const NormObjectId& objectId);
|
const NormObjectId& objectId);
|
||||||
|
|
||||||
void Accept() {accepted = true;}
|
void Accept() {accepted = true;}
|
||||||
|
|
||||||
NormObject::Type type;
|
NormObject::Type type;
|
||||||
class NormSession& session;
|
class NormSession& session;
|
||||||
class NormServerNode* server; // NULL value indicates local (tx) object
|
class NormSenderNode* sender; // NULL value indicates local (tx) object
|
||||||
unsigned int reference_count;
|
unsigned int reference_count;
|
||||||
NormObjectId transport_id;
|
NormObjectId transport_id;
|
||||||
|
|
||||||
NormObjectSize object_size;
|
NormObjectSize object_size;
|
||||||
UINT16 segment_size;
|
UINT16 segment_size;
|
||||||
|
UINT8 fec_id;
|
||||||
|
UINT8 fec_m;
|
||||||
UINT16 ndata;
|
UINT16 ndata;
|
||||||
UINT16 nparity;
|
UINT16 nparity;
|
||||||
NormBlockBuffer block_buffer;
|
NormBlockBuffer block_buffer;
|
||||||
bool pending_info; // set when we need to send or recv info
|
bool pending_info; // set when we need to send or recv info
|
||||||
ProtoSlidingMask pending_mask;
|
ProtoSlidingMask pending_mask;
|
||||||
bool repair_info; // client: set when
|
bool repair_info; // receiver: set when
|
||||||
ProtoSlidingMask repair_mask;
|
ProtoSlidingMask repair_mask;
|
||||||
NormBlockId current_block_id; // for suppression
|
NormBlockId current_block_id; // for suppression
|
||||||
NormSegmentId next_segment_id; // for suppression
|
NormSegmentId next_segment_id; // for suppression
|
||||||
|
|
@ -267,6 +281,7 @@ class NormObject
|
||||||
NormBlockId final_block_id;
|
NormBlockId final_block_id;
|
||||||
UINT16 final_segment_size;
|
UINT16 final_segment_size;
|
||||||
NackingMode nacking_mode;
|
NackingMode nacking_mode;
|
||||||
|
ProtoTime last_nack_time; // time of last NACK received (used for flow control)
|
||||||
char* info_ptr;
|
char* info_ptr;
|
||||||
UINT16 info_len;
|
UINT16 info_len;
|
||||||
|
|
||||||
|
|
@ -284,7 +299,7 @@ class NormFileObject : public NormObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NormFileObject(class NormSession& theSession,
|
NormFileObject(class NormSession& theSession,
|
||||||
class NormServerNode* theServer,
|
class NormSenderNode* theSender,
|
||||||
const NormObjectId& objectId);
|
const NormObjectId& objectId);
|
||||||
~NormFileObject();
|
~NormFileObject();
|
||||||
|
|
||||||
|
|
@ -302,7 +317,7 @@ class NormFileObject : public NormObject
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
bool PadToSize()
|
bool PadToSize()
|
||||||
{return file.Pad(GetSize().GetOffset());}
|
{return file.Pad(NormObject::GetSize().GetOffset());}
|
||||||
|
|
||||||
virtual bool WriteSegment(NormBlockId blockId,
|
virtual bool WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
|
|
@ -327,7 +342,7 @@ class NormDataObject : public NormObject
|
||||||
// (TBD) allow support of greater than 4GB size data objects
|
// (TBD) allow support of greater than 4GB size data objects
|
||||||
public:
|
public:
|
||||||
NormDataObject(class NormSession& theSession,
|
NormDataObject(class NormSession& theSession,
|
||||||
class NormServerNode* theServer,
|
class NormSenderNode* theSender,
|
||||||
const NormObjectId& objectId);
|
const NormObjectId& objectId);
|
||||||
~NormDataObject();
|
~NormDataObject();
|
||||||
|
|
||||||
|
|
@ -372,7 +387,7 @@ class NormStreamObject : public NormObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NormStreamObject(class NormSession& theSession,
|
NormStreamObject(class NormSession& theSession,
|
||||||
class NormServerNode* theServer,
|
class NormSenderNode* theSender,
|
||||||
const NormObjectId& objectId);
|
const NormObjectId& objectId);
|
||||||
~NormStreamObject();
|
~NormStreamObject();
|
||||||
|
|
||||||
|
|
@ -409,12 +424,23 @@ class NormStreamObject : public NormObject
|
||||||
bool HasVacancy()
|
bool HasVacancy()
|
||||||
{return (stream_closing ? false : write_vacancy);}
|
{return (stream_closing ? false : write_vacancy);}
|
||||||
|
|
||||||
|
NormBlock* StreamBlockLo()
|
||||||
|
{return stream_buffer.Find(stream_buffer.RangeLo());}
|
||||||
|
void SetLastNackTime(NormBlockId blockId, const ProtoTime& theTime)
|
||||||
|
{
|
||||||
|
NormBlock* block = stream_buffer.Find(blockId);
|
||||||
|
if (NULL != block) block->SetLastNackTime(theTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Read(char* buffer, unsigned int* buflen, bool findMsgStart = false);
|
bool Read(char* buffer, unsigned int* buflen, bool findMsgStart = false);
|
||||||
UINT32 Write(const char* buffer, UINT32 len, bool eom = false);
|
UINT32 Write(const char* buffer, UINT32 len, bool eom = false);
|
||||||
|
|
||||||
UINT32 GetCurrentReadOffset() {return read_offset;}
|
UINT32 GetCurrentReadOffset() {return read_offset;}
|
||||||
|
|
||||||
|
unsigned int GetCurrentBufferUsage() const // in segments
|
||||||
|
{return segment_pool.CurrentUsage();}
|
||||||
|
|
||||||
bool StreamUpdateStatus(NormBlockId blockId);
|
bool StreamUpdateStatus(NormBlockId blockId);
|
||||||
// Note that the "pending_mask" should be cleared and the
|
// Note that the "pending_mask" should be cleared and the
|
||||||
// "block_buffer" emptied before "StreamResync()" is invoked
|
// "block_buffer" emptied before "StreamResync()" is invoked
|
||||||
|
|
@ -423,7 +449,7 @@ class NormStreamObject : public NormObject
|
||||||
stream_sync = false;
|
stream_sync = false;
|
||||||
StreamUpdateStatus(blockId);
|
StreamUpdateStatus(blockId);
|
||||||
}
|
}
|
||||||
void StreamAdvance();
|
bool StreamAdvance();
|
||||||
|
|
||||||
virtual bool WriteSegment(NormBlockId blockId,
|
virtual bool WriteSegment(NormBlockId blockId,
|
||||||
NormSegmentId segmentId,
|
NormSegmentId segmentId,
|
||||||
|
|
@ -440,11 +466,11 @@ class NormStreamObject : public NormObject
|
||||||
// For receive stream, we can rewind to earliest buffered offset
|
// For receive stream, we can rewind to earliest buffered offset
|
||||||
void Rewind();
|
void Rewind();
|
||||||
|
|
||||||
bool LockBlocks(NormBlockId nextId, NormBlockId lastId);
|
bool LockBlocks(NormBlockId nextId, NormBlockId lastId, const ProtoTime& currentTime);
|
||||||
void UnlockBlock(NormBlockId blockId);
|
void UnlockBlock(NormBlockId blockId);
|
||||||
|
|
||||||
bool LockSegments(NormBlockId blockId, NormSegmentId firstId, NormSegmentId lastId);
|
bool LockSegments(NormBlockId blockId, NormSegmentId firstId, NormSegmentId lastId);
|
||||||
NormBlockId StreamBufferLo() {return stream_buffer.RangeLo();}
|
NormBlockId StreamBufferLo() const {return stream_buffer.RangeLo();}
|
||||||
void Prune(NormBlockId blockId, bool updateStatus);
|
void Prune(NormBlockId blockId, bool updateStatus);
|
||||||
|
|
||||||
bool IsFlushPending() {return flush_pending;}
|
bool IsFlushPending() {return flush_pending;}
|
||||||
|
|
@ -456,17 +482,25 @@ class NormStreamObject : public NormObject
|
||||||
(ndata-1));}
|
(ndata-1));}
|
||||||
|
|
||||||
NormBlockId GetNextBlockId() const
|
NormBlockId GetNextBlockId() const
|
||||||
{return (server ? read_index.block : write_index.block);}
|
{return (sender ? read_index.block : write_index.block);}
|
||||||
NormSegmentId GetNextSegmentId() const
|
NormSegmentId GetNextSegmentId() const
|
||||||
{return (server ? read_index.segment : write_index.segment);}
|
{return (sender ? read_index.segment : write_index.segment);}
|
||||||
|
|
||||||
UINT32 GetBlockPoolCount() {return block_pool.GetCount();}
|
UINT32 GetBlockPoolCount() {return block_pool.GetCount();}
|
||||||
void SetBlockPoolThreshold(UINT32 value)
|
void SetBlockPoolThreshold(UINT32 value)
|
||||||
{block_pool_threshold = value;}
|
{block_pool_threshold = value;}
|
||||||
|
|
||||||
|
|
||||||
|
unsigned long CurrentBufferUsage() const
|
||||||
|
{return (segment_size * segment_pool.CurrentUsage());}
|
||||||
|
unsigned long PeakBufferUsage() const
|
||||||
|
{return (segment_size * segment_pool.PeakUsage());}
|
||||||
|
unsigned long BufferOverunCount() const
|
||||||
|
{return segment_pool.OverunCount() + block_pool.OverrunCount();}
|
||||||
|
|
||||||
bool IsReadReady() const {return read_ready;}
|
bool IsReadReady() const {return read_ready;}
|
||||||
|
|
||||||
bool DetermineReadReadiness()
|
bool DetermineReadReadiness() const
|
||||||
{
|
{
|
||||||
NormBlock* block = stream_buffer.Find(read_index.block);
|
NormBlock* block = stream_buffer.Find(read_index.block);
|
||||||
return ((NULL != block) && (NULL != block->GetSegment(read_index.segment)));
|
return ((NULL != block) && (NULL != block->GetSegment(read_index.segment)));
|
||||||
|
|
@ -475,6 +509,8 @@ class NormStreamObject : public NormObject
|
||||||
bool IsReadIndex(NormBlockId blockId, NormSegmentId segmentId) const
|
bool IsReadIndex(NormBlockId blockId, NormSegmentId segmentId) const
|
||||||
{return ((blockId == read_index.block) && (segmentId == read_index.segment));}
|
{return ((blockId == read_index.block) && (segmentId == read_index.segment));}
|
||||||
|
|
||||||
|
bool PassiveReadCheck(NormBlockId blockId, NormSegmentId segmentId);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool ReadPrivate(char* buffer, unsigned int* buflen, bool findMsgStart = false);
|
bool ReadPrivate(char* buffer, unsigned int* buflen, bool findMsgStart = false);
|
||||||
void Terminate();
|
void Terminate();
|
||||||
|
|
@ -520,7 +556,7 @@ class NormSimObject : public NormObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
NormSimObject(class NormSession& theSession,
|
NormSimObject(class NormSession& theSession,
|
||||||
class NormServerNode* theServer,
|
class NormSenderNode* theSender,
|
||||||
const NormObjectId& objectId);
|
const NormObjectId& objectId);
|
||||||
~NormSimObject();
|
~NormSimObject();
|
||||||
|
|
||||||
|
|
@ -25,7 +25,8 @@ class NormSegmentPool
|
||||||
}
|
}
|
||||||
bool IsEmpty() const {return (NULL == seg_list);}
|
bool IsEmpty() const {return (NULL == seg_list);}
|
||||||
|
|
||||||
unsigned long CurrentUsage() const {return (seg_total - seg_count);}
|
unsigned int CurrentUsage() const
|
||||||
|
{return (seg_total - seg_count);}
|
||||||
unsigned long PeakUsage() const {return peak_usage;}
|
unsigned long PeakUsage() const {return peak_usage;}
|
||||||
unsigned long OverunCount() const {return overruns;}
|
unsigned long OverunCount() const {return overruns;}
|
||||||
unsigned int GetSegmentSize() {return seg_size;}
|
unsigned int GetSegmentSize() {return seg_size;}
|
||||||
|
|
@ -94,7 +95,7 @@ class NormBlock
|
||||||
segment_table[sid] = segment;
|
segment_table[sid] = segment;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Server routines
|
// Sender routines
|
||||||
void TxInit(NormBlockId& blockId, UINT16 ndata, UINT16 autoParity)
|
void TxInit(NormBlockId& blockId, UINT16 ndata, UINT16 autoParity)
|
||||||
{
|
{
|
||||||
id = blockId;
|
id = blockId;
|
||||||
|
|
@ -106,6 +107,7 @@ class NormBlock
|
||||||
parity_offset = autoParity;
|
parity_offset = autoParity;
|
||||||
flags = 0;
|
flags = 0;
|
||||||
seg_size_max = 0;
|
seg_size_max = 0;
|
||||||
|
last_nack_time.GetCurrentTime();
|
||||||
}
|
}
|
||||||
void TxRecover(NormBlockId& blockId, UINT16 ndata, UINT16 nparity)
|
void TxRecover(NormBlockId& blockId, UINT16 ndata, UINT16 nparity)
|
||||||
{
|
{
|
||||||
|
|
@ -139,10 +141,12 @@ class NormBlock
|
||||||
bool AppendRepairAdv(NormCmdRepairAdvMsg& cmd,
|
bool AppendRepairAdv(NormCmdRepairAdvMsg& cmd,
|
||||||
NormObjectId objectId,
|
NormObjectId objectId,
|
||||||
bool repairInfo,
|
bool repairInfo,
|
||||||
|
UINT8 fecId,
|
||||||
|
UINT8 fecM,
|
||||||
UINT16 numData,
|
UINT16 numData,
|
||||||
UINT16 segmentSize);
|
UINT16 segmentSize);
|
||||||
|
|
||||||
// Client routines
|
// Receiver routines
|
||||||
void RxInit(NormBlockId& blockId, UINT16 ndata, UINT16 nparity)
|
void RxInit(NormBlockId& blockId, UINT16 ndata, UINT16 nparity)
|
||||||
{
|
{
|
||||||
id = blockId;
|
id = blockId;
|
||||||
|
|
@ -228,14 +232,25 @@ class NormBlock
|
||||||
UINT16 finalSegmentSize) const;
|
UINT16 finalSegmentSize) const;
|
||||||
|
|
||||||
bool AppendRepairRequest(NormNackMsg& nack,
|
bool AppendRepairRequest(NormNackMsg& nack,
|
||||||
|
UINT8 fecId,
|
||||||
|
UINT8 fecM,
|
||||||
UINT16 numData,
|
UINT16 numData,
|
||||||
UINT16 numParity,
|
UINT16 numParity,
|
||||||
NormObjectId objectId,
|
NormObjectId objectId,
|
||||||
bool pendingInfo,
|
bool pendingInfo,
|
||||||
UINT16 segmentSize);
|
UINT16 segmentSize);
|
||||||
|
|
||||||
|
|
||||||
|
void SetLastNackTime(const ProtoTime& theTime)
|
||||||
|
{last_nack_time = theTime;}
|
||||||
|
const ProtoTime& GetLastNackTime() const
|
||||||
|
{return last_nack_time;}
|
||||||
|
double GetNackAge() const
|
||||||
|
{return ProtoTime::Delta(ProtoTime().GetCurrentTime(), last_nack_time);}
|
||||||
|
|
||||||
//void DisplayPendingMask(FILE* f) {pending_mask.Display(f);}
|
//void DisplayPendingMask(FILE* f) {pending_mask.Display(f);}
|
||||||
|
|
||||||
bool IsEmpty() const;
|
//bool IsEmpty() const;
|
||||||
void EmptyToPool(NormSegmentPool& segmentPool);
|
void EmptyToPool(NormSegmentPool& segmentPool);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -251,6 +266,7 @@ class NormBlock
|
||||||
|
|
||||||
ProtoBitmask pending_mask;
|
ProtoBitmask pending_mask;
|
||||||
ProtoBitmask repair_mask;
|
ProtoBitmask repair_mask;
|
||||||
|
ProtoTime last_nack_time; // for stream flow control
|
||||||
|
|
||||||
NormBlock* next;
|
NormBlock* next;
|
||||||
}; // end class NormBlock
|
}; // end class NormBlock
|
||||||
|
|
@ -274,7 +290,7 @@ class NormBlockPool
|
||||||
}
|
}
|
||||||
else if (!overrun_flag)
|
else if (!overrun_flag)
|
||||||
{
|
{
|
||||||
DMSG(0, "NormBlockPool::Get() warning: operating with constrained buffering resources\n");
|
PLOG(PL_DEBUG, "NormBlockPool::Get() warning: operating with constrained buffering resources\n");
|
||||||
overruns++;
|
overruns++;
|
||||||
overrun_flag = true;
|
overrun_flag = true;
|
||||||
}
|
}
|
||||||
|
|
@ -8,6 +8,21 @@
|
||||||
|
|
||||||
#include "protokit.h"
|
#include "protokit.h"
|
||||||
|
|
||||||
|
#include "protoCap.h" // for ProtoCap for ECN_SUPPORT
|
||||||
|
|
||||||
|
|
||||||
|
// When this is defined, our experimental tweak to
|
||||||
|
// limiting suggested cc rate to 2.0* measured recv rate is
|
||||||
|
// used during steady state similar to "slow start"
|
||||||
|
// conditions. What this means is that when data transmission
|
||||||
|
// is idle, the rate will be reduced. This _may_ impact
|
||||||
|
// certain use cases. Our theory here is that preventing rate
|
||||||
|
// overshoot will be more helpful and safer than the penalty
|
||||||
|
// imposed. This uses the non-RFC5740 NORM_CC_FLAG_LIMIT in
|
||||||
|
// NORM-CC feedback header extensions
|
||||||
|
|
||||||
|
#define LIMIT_CC_RATE 1
|
||||||
|
|
||||||
class NormController
|
class NormController
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
@ -19,13 +34,16 @@ class NormController
|
||||||
TX_QUEUE_EMPTY,
|
TX_QUEUE_EMPTY,
|
||||||
TX_FLUSH_COMPLETED,
|
TX_FLUSH_COMPLETED,
|
||||||
TX_WATERMARK_COMPLETED,
|
TX_WATERMARK_COMPLETED,
|
||||||
|
TX_CMD_SENT,
|
||||||
TX_OBJECT_SENT,
|
TX_OBJECT_SENT,
|
||||||
TX_OBJECT_PURGED,
|
TX_OBJECT_PURGED,
|
||||||
|
TX_RATE_CHANGED,
|
||||||
LOCAL_SENDER_CLOSED,
|
LOCAL_SENDER_CLOSED,
|
||||||
REMOTE_SENDER_NEW,
|
REMOTE_SENDER_NEW,
|
||||||
REMOTE_SENDER_ACTIVE,
|
REMOTE_SENDER_ACTIVE,
|
||||||
REMOTE_SENDER_INACTIVE,
|
REMOTE_SENDER_INACTIVE,
|
||||||
REMOTE_SENDER_PURGED,
|
REMOTE_SENDER_PURGED,
|
||||||
|
RX_CMD_NEW,
|
||||||
RX_OBJECT_NEW,
|
RX_OBJECT_NEW,
|
||||||
RX_OBJECT_INFO,
|
RX_OBJECT_INFO,
|
||||||
RX_OBJECT_UPDATED,
|
RX_OBJECT_UPDATED,
|
||||||
|
|
@ -39,7 +57,7 @@ class NormController
|
||||||
virtual void Notify(NormController::Event event,
|
virtual void Notify(NormController::Event event,
|
||||||
class NormSessionMgr* sessionMgr,
|
class NormSessionMgr* sessionMgr,
|
||||||
class NormSession* session,
|
class NormSession* session,
|
||||||
class NormServerNode* sender,
|
class NormSenderNode* sender,
|
||||||
class NormObject* object) = 0;
|
class NormObject* object) = 0;
|
||||||
|
|
||||||
}; // end class NormController
|
}; // end class NormController
|
||||||
|
|
@ -49,7 +67,8 @@ class NormSessionMgr
|
||||||
friend class NormSession;
|
friend class NormSession;
|
||||||
public:
|
public:
|
||||||
NormSessionMgr(ProtoTimerMgr& timerMgr,
|
NormSessionMgr(ProtoTimerMgr& timerMgr,
|
||||||
ProtoSocket::Notifier& socketNotifier);
|
ProtoSocket::Notifier& socketNotifier,
|
||||||
|
ProtoChannel::Notifier* channelNotifier = NULL);
|
||||||
~NormSessionMgr();
|
~NormSessionMgr();
|
||||||
void SetController(NormController* theController)
|
void SetController(NormController* theController)
|
||||||
{controller = theController;}
|
{controller = theController;}
|
||||||
|
|
@ -62,7 +81,7 @@ class NormSessionMgr
|
||||||
|
|
||||||
void Notify(NormController::Event event,
|
void Notify(NormController::Event event,
|
||||||
class NormSession* session,
|
class NormSession* session,
|
||||||
class NormServerNode* sender,
|
class NormSenderNode* sender,
|
||||||
class NormObject* object)
|
class NormObject* object)
|
||||||
{
|
{
|
||||||
if (controller)
|
if (controller)
|
||||||
|
|
@ -72,14 +91,17 @@ class NormSessionMgr
|
||||||
void ActivateTimer(ProtoTimer& timer) {timer_mgr.ActivateTimer(timer);}
|
void ActivateTimer(ProtoTimer& timer) {timer_mgr.ActivateTimer(timer);}
|
||||||
ProtoTimerMgr& GetTimerMgr() const {return timer_mgr;}
|
ProtoTimerMgr& GetTimerMgr() const {return timer_mgr;}
|
||||||
ProtoSocket::Notifier& GetSocketNotifier() const {return socket_notifier;}
|
ProtoSocket::Notifier& GetSocketNotifier() const {return socket_notifier;}
|
||||||
|
ProtoChannel::Notifier* GetChannelNotifier() const {return channel_notifier;}
|
||||||
|
|
||||||
void DoSystemTimeout()
|
void DoSystemTimeout()
|
||||||
{timer_mgr.DoSystemTimeout();}
|
{timer_mgr.DoSystemTimeout();}
|
||||||
|
|
||||||
NormController* GetController() const {return controller;}
|
NormController* GetController() const {return controller;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ProtoTimerMgr& timer_mgr;
|
ProtoTimerMgr& timer_mgr;
|
||||||
ProtoSocket::Notifier& socket_notifier;
|
ProtoSocket::Notifier& socket_notifier;
|
||||||
|
ProtoChannel::Notifier* channel_notifier;
|
||||||
NormController* controller;
|
NormController* controller;
|
||||||
|
|
||||||
class NormSession* top_session; // top of NormSession list
|
class NormSession* top_session; // top of NormSession list
|
||||||
|
|
@ -106,8 +128,13 @@ class NormSession
|
||||||
static const UINT16 DEFAULT_NPARITY;
|
static const UINT16 DEFAULT_NPARITY;
|
||||||
static const UINT16 DEFAULT_TX_CACHE_MIN;
|
static const UINT16 DEFAULT_TX_CACHE_MIN;
|
||||||
static const UINT16 DEFAULT_TX_CACHE_MAX;
|
static const UINT16 DEFAULT_TX_CACHE_MAX;
|
||||||
|
static const UINT32 DEFAULT_TX_CACHE_SIZE;
|
||||||
|
static const double DEFAULT_FLOW_CONTROL_FACTOR;
|
||||||
|
static const UINT16 DEFAULT_RX_CACHE_MAX;
|
||||||
static const int DEFAULT_ROBUST_FACTOR;
|
static const int DEFAULT_ROBUST_FACTOR;
|
||||||
|
|
||||||
|
enum {IFACE_NAME_MAX = 31};
|
||||||
|
|
||||||
enum ProbingMode {PROBE_NONE, PROBE_PASSIVE, PROBE_ACTIVE};
|
enum ProbingMode {PROBE_NONE, PROBE_PASSIVE, PROBE_ACTIVE};
|
||||||
enum AckingStatus
|
enum AckingStatus
|
||||||
{
|
{
|
||||||
|
|
@ -117,9 +144,20 @@ class NormSession
|
||||||
ACK_SUCCESS
|
ACK_SUCCESS
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// This is currently used to determine whether
|
||||||
|
// and how to "auto populate" the acking node
|
||||||
|
// list based on received messages
|
||||||
|
enum TrackingStatus
|
||||||
|
{
|
||||||
|
TRACK_NONE = 0x00,
|
||||||
|
TRACK_RECEIVERS = 0x01,
|
||||||
|
TRACK_SENDERS = 0x02,
|
||||||
|
TRACK_ALL = 0x03
|
||||||
|
};
|
||||||
|
|
||||||
// General methods
|
// General methods
|
||||||
const NormNodeId& LocalNodeId() const {return local_node_id;}
|
const NormNodeId& LocalNodeId() const {return local_node_id;}
|
||||||
bool Open(const char* interfaceName = NULL);
|
bool Open();
|
||||||
void Close();
|
void Close();
|
||||||
bool IsOpen() {return (rx_socket.IsOpen() || tx_socket->IsOpen());}
|
bool IsOpen() {return (rx_socket.IsOpen() || tx_socket->IsOpen());}
|
||||||
const ProtoAddress& Address() {return address;}
|
const ProtoAddress& Address() {return address;}
|
||||||
|
|
@ -145,12 +183,39 @@ class NormSession
|
||||||
loopback = result ? state : loopback;
|
loopback = result ? state : loopback;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
void SetTxPort(UINT16 txPort) {tx_port = txPort;}
|
|
||||||
void SetRxPortReuse(bool enable, bool bindToSessionAddress = true)
|
bool SetFragmentation(bool state)
|
||||||
{
|
{
|
||||||
rx_port_reuse = enable; // allow sessionPort reuse when true
|
bool result = tx_socket->IsOpen() ? tx_socket->SetFragmentation(state) : true;
|
||||||
rx_addr_bind = bindToSessionAddress; // bind rx_socket to sessionAddr when true
|
fragmentation = result ? state : fragmentation;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MUST be called _after_ SetAddress()
|
||||||
|
bool SetTxPort(UINT16 txPort, bool enableReuse = false, const char* srcAddr = NULL);
|
||||||
|
|
||||||
|
UINT16 GetTxPort() const;
|
||||||
|
|
||||||
|
bool SetRxPortReuse(bool enableReuse,
|
||||||
|
const char* rxAddress, // bind() to <rxAddress>/<sessionPort>
|
||||||
|
const char* senderAddress = (const char*)0, // connect() to <senderAddress>/<senderPort>
|
||||||
|
UINT16 senderPort = 0);
|
||||||
|
|
||||||
|
UINT16 GetRxPort() const;
|
||||||
|
|
||||||
|
// "SetEcnSupport(true)" sets up raw packet capture (pcap) so that incoming packet
|
||||||
|
// ECN status may be checked
|
||||||
|
// NOTE: only effective _before_ sndr/rcvr startup!
|
||||||
|
void SetEcnSupport(bool ecnEnable, bool ignoreLoss, bool tolerateLoss)
|
||||||
|
{
|
||||||
|
ecn_enabled = ecnEnable;
|
||||||
|
ecn_ignore_loss = ecnEnable ? ignoreLoss : false;
|
||||||
|
cc_tolerate_loss = ecn_ignore_loss ? false : tolerateLoss;
|
||||||
|
}
|
||||||
|
bool GetEcnIgnoreLoss() const
|
||||||
|
{return ecn_ignore_loss;}
|
||||||
|
bool GetCCTolerateLoss() const
|
||||||
|
{return cc_tolerate_loss;}
|
||||||
static double CalculateRate(double size, double rtt, double loss);
|
static double CalculateRate(double size, double rtt, double loss);
|
||||||
|
|
||||||
NormSessionMgr& GetSessionMgr() {return session_mgr;}
|
NormSessionMgr& GetSessionMgr() {return session_mgr;}
|
||||||
|
|
@ -161,38 +226,74 @@ class NormSession
|
||||||
{return rx_socket.SetRxBufferSize(bufferSize);}
|
{return rx_socket.SetRxBufferSize(bufferSize);}
|
||||||
|
|
||||||
// Session parameters
|
// Session parameters
|
||||||
double GetTxRate()
|
double GetTxRate(); // returns bits/sec
|
||||||
{
|
|
||||||
return (tx_rate * 8.0); // convert to bits/second
|
|
||||||
}
|
|
||||||
// (TBD) watch timer scheduling and min/max bounds
|
// (TBD) watch timer scheduling and min/max bounds
|
||||||
void SetTxRate(double txRate)
|
void SetTxRate(double txRate)
|
||||||
{
|
{
|
||||||
txRate /= 8.0; // convert to bytes/sec
|
txRate /= 8.0; // convert to bytes/sec
|
||||||
|
posted_tx_rate_changed = false;
|
||||||
SetTxRateInternal(txRate);
|
SetTxRateInternal(txRate);
|
||||||
}
|
}
|
||||||
double BackoffFactor() {return backoff_factor;}
|
void SetTxRateBounds(double rateMin, double rateMax);
|
||||||
void SetBackoffFactor(double value) {backoff_factor = value;}
|
|
||||||
bool CongestionControl() {return cc_enable;}
|
double BackoffFactor()
|
||||||
void SetCongestionControl(bool state)
|
{return backoff_factor;}
|
||||||
|
void SetBackoffFactor(double value)
|
||||||
|
{backoff_factor = value;}
|
||||||
|
bool CongestionControl()
|
||||||
|
{return cc_enable;}
|
||||||
|
void SetCongestionControl(bool state, bool adjustRate = true)
|
||||||
{
|
{
|
||||||
|
if (state) SetGrttProbingMode(PROBE_ACTIVE);
|
||||||
cc_enable = state;
|
cc_enable = state;
|
||||||
|
cc_adjust = adjustRate;
|
||||||
|
if (state) probe_proactive = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This method enables/disables flow control operation.
|
||||||
|
void SetFlowControl(double flowControlFactor)
|
||||||
|
{flow_control_factor = flowControlFactor;}
|
||||||
|
double GetFlowControl() const
|
||||||
|
{return flow_control_factor;}
|
||||||
|
|
||||||
|
// This method is used by "internal" NormSession and NormObject code
|
||||||
|
// to activate the timer-based flow control when needed.
|
||||||
|
void ActivateFlowControl(double delay, NormObjectId objectId, NormController::Event event);
|
||||||
|
void DeactivateFlowControl()
|
||||||
|
{flow_control_timer.Deactivate();}
|
||||||
|
bool FlowControlIsActive() const
|
||||||
|
{return flow_control_timer.IsActive();}
|
||||||
|
NormObjectId GetFlowControlObject() const
|
||||||
|
{return flow_control_object;}
|
||||||
|
// The value returned here is the time interval used to determine
|
||||||
|
// whether there has been "recent" NACKing for a given object or block.
|
||||||
|
// A larger "flow_control_factor" stretches the time interval that
|
||||||
|
// is considered "recent" and thus imposes stronger flow control.
|
||||||
|
// A _strong_ "flow_control_factor" would be on the order of
|
||||||
|
// "tx_robust_factor", but note larger values require more
|
||||||
|
// tx/rx caching and/or buffering to sustain high throughput
|
||||||
|
// NOTE "flow_control_factor = 0.0" means _no_ timer-based
|
||||||
|
// flow control is imposed
|
||||||
|
double GetFlowControlDelay() const
|
||||||
|
{
|
||||||
|
double fdelay = (flow_control_factor * (SenderGrtt() * (backoff_factor + 1)));
|
||||||
|
return ((fdelay > 0.020) ? fdelay : 0.020); // minimum 20 msec flow control
|
||||||
|
}
|
||||||
|
|
||||||
// GRTT measurement management
|
// GRTT measurement management
|
||||||
void SetGrttProbingMode(ProbingMode probingMode);
|
void SetGrttProbingMode(ProbingMode probingMode);
|
||||||
void SetGrttProbingInterval(double intervalMin, double intervalMax);
|
void SetGrttProbingInterval(double intervalMin, double intervalMax);
|
||||||
void SetGrttMax(double grttMax) {grtt_max = grttMax;}
|
void SetGrttMax(double grttMax) {grtt_max = grttMax;}
|
||||||
|
|
||||||
void SetTxRateBounds(double rateMin, double rateMax);
|
|
||||||
bool SetTxCacheBounds(NormObjectSize sizeMax,
|
bool SetTxCacheBounds(NormObjectSize sizeMax,
|
||||||
unsigned long countMin,
|
unsigned long countMin,
|
||||||
unsigned long countMax);
|
unsigned long countMax);
|
||||||
void Notify(NormController::Event event,
|
void Notify(NormController::Event event,
|
||||||
class NormServerNode* server,
|
class NormSenderNode* sender,
|
||||||
class NormObject* object)
|
class NormObject* object)
|
||||||
{
|
{
|
||||||
notify_pending = true;
|
notify_pending = true;
|
||||||
session_mgr.Notify(event, this, server, object);
|
session_mgr.Notify(event, this, sender, object);
|
||||||
notify_pending = false;
|
notify_pending = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -205,20 +306,21 @@ class NormSession
|
||||||
void SetUserData(const void* userData) {user_data = userData;}
|
void SetUserData(const void* userData) {user_data = userData;}
|
||||||
const void* GetUserData() {return user_data;}
|
const void* GetUserData() {return user_data;}
|
||||||
|
|
||||||
// Server methods
|
// Sender methods
|
||||||
void ServerSetBaseObjectId(NormObjectId baseId)
|
void SenderSetBaseObjectId(NormObjectId baseId)
|
||||||
{
|
{
|
||||||
next_tx_object_id = IsServer() ? next_tx_object_id : baseId;
|
next_tx_object_id = IsSender() ? next_tx_object_id : baseId;
|
||||||
//instance_id = IsServer() ? instance_id : (UINT16)baseId;
|
//instance_id = IsSender() ? instance_id : (UINT16)baseId;
|
||||||
}
|
}
|
||||||
bool IsServer() {return is_server;}
|
bool IsSender() {return is_sender;}
|
||||||
bool StartServer(UINT16 instanceId,
|
bool StartSender(UINT16 instanceId,
|
||||||
UINT32 bufferSpace,
|
UINT32 bufferSpace,
|
||||||
UINT16 segmentSize,
|
UINT16 segmentSize,
|
||||||
UINT16 numData,
|
UINT16 numData,
|
||||||
UINT16 numParity,
|
UINT16 numParity);
|
||||||
const char* interfaceName = NULL);
|
void StopSender();
|
||||||
void StopServer();
|
void SetTxOnly(bool txOnly, bool connectToSessionAddress = false);
|
||||||
|
|
||||||
NormStreamObject* QueueTxStream(UINT32 bufferSize,
|
NormStreamObject* QueueTxStream(UINT32 bufferSize,
|
||||||
bool doubleBuffer = false,
|
bool doubleBuffer = false,
|
||||||
const char* infoPtr = NULL,
|
const char* infoPtr = NULL,
|
||||||
|
|
@ -235,15 +337,29 @@ class NormSession
|
||||||
|
|
||||||
void DeleteTxObject(NormObject* obj);
|
void DeleteTxObject(NormObject* obj);
|
||||||
|
|
||||||
// postive ack mgmnt
|
NormObject* SenderFindTxObject(NormObjectId objectId)
|
||||||
void ServerSetWatermark(NormObjectId objectId,
|
{return tx_table.Find(objectId);}
|
||||||
NormBlockId blockId,
|
|
||||||
NormSegmentId segmentId);
|
|
||||||
void ServerCancelWatermark();
|
|
||||||
bool ServerAddAckingNode(NormNodeId nodeId);
|
|
||||||
void ServerRemoveAckingNode(NormNodeId nodeId);
|
|
||||||
AckingStatus ServerGetAckingStatus(NormNodeId nodeId);
|
|
||||||
|
|
||||||
|
// postive ack mgmnt
|
||||||
|
void SenderSetWatermark(NormObjectId objectId,
|
||||||
|
NormBlockId blockId,
|
||||||
|
NormSegmentId segmentId,
|
||||||
|
bool overrideFlush = false);
|
||||||
|
void SenderResetWatermark();
|
||||||
|
void SenderCancelWatermark();
|
||||||
|
|
||||||
|
|
||||||
|
void SenderSetAutoAckingNodes(TrackingStatus trackingStatus)
|
||||||
|
{acking_auto_populate = trackingStatus;}
|
||||||
|
bool SenderAddAckingNode(NormNodeId nodeId);
|
||||||
|
void SenderRemoveAckingNode(NormNodeId nodeId);
|
||||||
|
AckingStatus SenderGetAckingStatus(NormNodeId nodeId);
|
||||||
|
// Set "prevNodeId = NORM_NODE_NONE" to init this iteration (returns "false" when done)
|
||||||
|
bool SenderGetNextAckingNode(NormNodeId& prevNodeId, AckingStatus* ackingStatus = NULL);
|
||||||
|
|
||||||
|
// App-defined command support methods
|
||||||
|
bool SenderSendCmd(const char* cmdBuffer, unsigned int cmdLength, bool robust);
|
||||||
|
void SenderCancelCmd();
|
||||||
|
|
||||||
// robust factor
|
// robust factor
|
||||||
void SetTxRobustFactor(int value)
|
void SetTxRobustFactor(int value)
|
||||||
|
|
@ -255,31 +371,34 @@ class NormSession
|
||||||
int GetRxRobustFactor() const
|
int GetRxRobustFactor() const
|
||||||
{return rx_robust_factor;}
|
{return rx_robust_factor;}
|
||||||
|
|
||||||
UINT16 ServerSegmentSize() const {return segment_size;}
|
UINT8 GetSenderFecId() const {return fec_id;}
|
||||||
UINT16 ServerBlockSize() const {return ndata;}
|
UINT8 GetSenderFecFieldSize() const {return fec_m;}
|
||||||
UINT16 ServerNumParity() const {return nparity;}
|
UINT16 SenderSegmentSize() const {return segment_size;}
|
||||||
UINT16 ServerAutoParity() const {return auto_parity;}
|
UINT16 SenderBlockSize() const {return ndata;}
|
||||||
void ServerSetAutoParity(UINT16 autoParity)
|
UINT16 SenderNumParity() const {return nparity;}
|
||||||
|
UINT16 SenderAutoParity() const {return auto_parity;}
|
||||||
|
void SenderSetAutoParity(UINT16 autoParity)
|
||||||
{ASSERT(autoParity <= nparity); auto_parity = autoParity;}
|
{ASSERT(autoParity <= nparity); auto_parity = autoParity;}
|
||||||
UINT16 ServerExtraParity() const {return extra_parity;}
|
UINT16 SenderExtraParity() const {return extra_parity;}
|
||||||
void ServerSetExtraParity(UINT16 extraParity)
|
void SenderSetExtraParity(UINT16 extraParity)
|
||||||
{extra_parity = extraParity;}
|
{extra_parity = extraParity;}
|
||||||
|
|
||||||
// EMCON Server (useful when there are silent receivers)
|
|
||||||
|
// EMCON Sender (useful when there are silent receivers)
|
||||||
// (NORM_INFO is redundantly sent)
|
// (NORM_INFO is redundantly sent)
|
||||||
void SndrSetEmcon(bool state)
|
void SndrSetEmcon(bool state)
|
||||||
{sndr_emcon = true;}
|
{sndr_emcon = true;}
|
||||||
bool SndrEmcon() const
|
bool SndrEmcon() const
|
||||||
{return sndr_emcon;}
|
{return sndr_emcon;}
|
||||||
|
|
||||||
bool ServerGetFirstPending(NormObjectId& objectId)
|
bool SenderGetFirstPending(NormObjectId& objectId)
|
||||||
{
|
{
|
||||||
UINT32 index;
|
UINT32 index;
|
||||||
bool result = tx_pending_mask.GetFirstSet(index);
|
bool result = tx_pending_mask.GetFirstSet(index);
|
||||||
objectId = (UINT16)index;
|
objectId = (UINT16)index;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
bool ServerGetFirstRepairPending(NormObjectId& objectId)
|
bool SenderGetFirstRepairPending(NormObjectId& objectId)
|
||||||
{
|
{
|
||||||
UINT32 index;
|
UINT32 index;
|
||||||
bool result = tx_repair_mask.GetFirstSet(index);
|
bool result = tx_repair_mask.GetFirstSet(index);
|
||||||
|
|
@ -287,10 +406,10 @@ class NormSession
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
double ServerGrtt() {return grtt_advertised;}
|
double SenderGrtt() const {return grtt_advertised;}
|
||||||
void ServerSetGrtt(double grttValue)
|
void SenderSetGrtt(double grttValue)
|
||||||
{
|
{
|
||||||
if (IsServer())
|
if (IsSender())
|
||||||
{
|
{
|
||||||
double grttMin = 2.0 * ((double)(44+segment_size))/tx_rate;
|
double grttMin = 2.0 * ((double)(44+segment_size))/tx_rate;
|
||||||
grttValue = (grttValue < grttMin) ? grttMin : grttValue;
|
grttValue = (grttValue < grttMin) ? grttMin : grttValue;
|
||||||
|
|
@ -298,59 +417,67 @@ class NormSession
|
||||||
grtt_quantized = NormQuantizeRtt(grttValue);
|
grtt_quantized = NormQuantizeRtt(grttValue);
|
||||||
grtt_measured = grtt_advertised = NormUnquantizeRtt(grtt_quantized);
|
grtt_measured = grtt_advertised = NormUnquantizeRtt(grtt_quantized);
|
||||||
}
|
}
|
||||||
double ServerGroupSize() {return gsize_measured;}
|
double SenderGroupSize() {return gsize_measured;}
|
||||||
void ServerSetGroupSize(double gsize)
|
void SenderSetGroupSize(double gsize)
|
||||||
{
|
{
|
||||||
gsize_measured = gsize;
|
gsize_measured = gsize;
|
||||||
gsize_quantized = NormQuantizeGroupSize(gsize);
|
gsize_quantized = NormQuantizeGroupSize(gsize);
|
||||||
gsize_advertised = NormUnquantizeGroupSize(gsize_quantized);
|
gsize_advertised = NormUnquantizeGroupSize(gsize_quantized);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ServerEncode(const char* segment, char** parityVectorList)
|
void SenderEncode(unsigned int segmentId, const char* segment, char** parityVectorList)
|
||||||
{encoder->Encode(segment, parityVectorList);}
|
{encoder->Encode(segmentId, segment, parityVectorList);}
|
||||||
|
|
||||||
|
|
||||||
NormBlock* ServerGetFreeBlock(NormObjectId objectId, NormBlockId blockId);
|
NormBlock* SenderGetFreeBlock(NormObjectId objectId, NormBlockId blockId);
|
||||||
void ServerPutFreeBlock(NormBlock* block)
|
void SenderPutFreeBlock(NormBlock* block)
|
||||||
{
|
{
|
||||||
block->EmptyToPool(segment_pool);
|
block->EmptyToPool(segment_pool);
|
||||||
block_pool.Put(block);
|
block_pool.Put(block);
|
||||||
}
|
}
|
||||||
char* ServerGetFreeSegment(NormObjectId objectId, NormBlockId blockId);
|
char* SenderGetFreeSegment(NormObjectId objectId, NormBlockId blockId);
|
||||||
void ServerPutFreeSegment(char* segment) {segment_pool.Put(segment);}
|
void SenderPutFreeSegment(char* segment) {segment_pool.Put(segment);}
|
||||||
|
|
||||||
|
|
||||||
void PromptServer() {QueueMessage(NULL);}
|
void PromptSender() {QueueMessage(NULL);}
|
||||||
|
|
||||||
void TouchServer()
|
void TouchSender()
|
||||||
{
|
{
|
||||||
posted_tx_queue_empty = false;
|
posted_tx_queue_empty = false;
|
||||||
PromptServer();
|
PromptSender();
|
||||||
//if (!notify_pending) Serve();
|
//if (!notify_pending) Serve();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Client methods
|
bool GetPostedTxQueueEmpty() const
|
||||||
bool StartClient(unsigned long bufferSpace,
|
{return posted_tx_queue_empty;}
|
||||||
const char* interfaceName = NULL);
|
|
||||||
void StopClient();
|
|
||||||
bool IsClient() const {return is_client;}
|
|
||||||
unsigned long RemoteServerBufferSize() const
|
|
||||||
{return remote_server_buffer_size;}
|
|
||||||
void ClientSetUnicastNacks(bool state) {unicast_nacks = state;}
|
|
||||||
bool ClientGetUnicastNacks() const {return unicast_nacks;}
|
|
||||||
|
|
||||||
void ClientSetSilent(bool state)
|
// Receiver methods
|
||||||
{client_silent = state;}
|
bool StartReceiver(unsigned long bufferSpace);
|
||||||
bool ClientIsSilent() const {return client_silent;}
|
void StopReceiver();
|
||||||
|
bool IsReceiver() const {return is_receiver;}
|
||||||
|
unsigned long RemoteSenderBufferSize() const
|
||||||
|
{return remote_sender_buffer_size;}
|
||||||
|
|
||||||
|
void DeleteRemoteSender(NormSenderNode& senderNode);
|
||||||
|
|
||||||
|
// Call this to do remote sender memory allocations ahead of time
|
||||||
|
bool PreallocateRemoteSender(UINT16 segmentSize, UINT16 numData, UINT16 numParity);
|
||||||
|
|
||||||
|
void ReceiverSetUnicastNacks(bool state) {unicast_nacks = state;}
|
||||||
|
bool ReceiverGetUnicastNacks() const {return unicast_nacks;}
|
||||||
|
|
||||||
|
void ReceiverSetSilent(bool state)
|
||||||
|
{receiver_silent = state;}
|
||||||
|
bool ReceiverIsSilent() const {return receiver_silent;}
|
||||||
|
|
||||||
void RcvrSetIgnoreInfo(bool state)
|
void RcvrSetIgnoreInfo(bool state)
|
||||||
{rcvr_ignore_info = state;}
|
{rcvr_ignore_info = state;}
|
||||||
bool RcvrIgnoreInfo() const
|
bool RcvrIgnoreInfo() const
|
||||||
{return rcvr_ignore_info;}
|
{return rcvr_ignore_info;}
|
||||||
|
|
||||||
// "-1" corresponds to typical operation where source data for
|
// The default "rcvr_max_delay = -1" corresponds to typical
|
||||||
// partially received FEC blocks are only provided to the app
|
// operation where source data forpartially received FEC blocks
|
||||||
// when buffer constraints require it.
|
// are only provided to the app when buffer constraints require it.
|
||||||
// Otherwise, the "maxDelay" corresponds to the max number
|
// Otherwise, the "maxDelay" corresponds to the max number
|
||||||
// of FEC blocks the receiver waits before passing partially
|
// of FEC blocks the receiver waits before passing partially
|
||||||
// received blocks to the app.
|
// received blocks to the app.
|
||||||
|
|
@ -359,24 +486,47 @@ class NormSession
|
||||||
void RcvrSetMaxDelay(INT32 maxDelay)
|
void RcvrSetMaxDelay(INT32 maxDelay)
|
||||||
{rcvr_max_delay = maxDelay;}
|
{rcvr_max_delay = maxDelay;}
|
||||||
bool RcvrIsLowDelay()
|
bool RcvrIsLowDelay()
|
||||||
{return (ClientIsSilent() && (rcvr_max_delay >= 0));}
|
{return (ReceiverIsSilent() && (rcvr_max_delay >= 0));}
|
||||||
INT32 RcvrGetMaxDelay() const
|
INT32 RcvrGetMaxDelay() const
|
||||||
{return rcvr_max_delay;}
|
{return rcvr_max_delay;}
|
||||||
|
|
||||||
NormObject::NackingMode ClientGetDefaultNackingMode() const
|
// When "rcvr_realtime" is set to "true", the buffer managment scheme of
|
||||||
|
// favoring newly arriving data over attempting reliable reception of
|
||||||
|
// buffered data is observed. This is the same buffer management that
|
||||||
|
// is used for silent receiver operation
|
||||||
|
// (TBD) allow the above "low delay" option to work with this, too?
|
||||||
|
void RcvrSetRealtime(bool state)
|
||||||
|
{rcvr_realtime = state;}
|
||||||
|
bool RcvrIsRealtime() const
|
||||||
|
{return rcvr_realtime;}
|
||||||
|
|
||||||
|
NormObject::NackingMode ReceiverGetDefaultNackingMode() const
|
||||||
{return default_nacking_mode;}
|
{return default_nacking_mode;}
|
||||||
void ClientSetDefaultNackingMode(NormObject::NackingMode nackingMode)
|
void ReceiverSetDefaultNackingMode(NormObject::NackingMode nackingMode)
|
||||||
{default_nacking_mode = nackingMode;}
|
{default_nacking_mode = nackingMode;}
|
||||||
|
|
||||||
NormServerNode::RepairBoundary ClientGetDefaultRepairBoundary() const
|
NormSenderNode::RepairBoundary ReceiverGetDefaultRepairBoundary() const
|
||||||
{return default_repair_boundary;}
|
{return default_repair_boundary;}
|
||||||
void ClientSetDefaultRepairBoundary(NormServerNode::RepairBoundary repairBoundary)
|
void ReceiverSetDefaultRepairBoundary(NormSenderNode::RepairBoundary repairBoundary)
|
||||||
{default_repair_boundary = repairBoundary;}
|
{default_repair_boundary = repairBoundary;}
|
||||||
|
|
||||||
|
NormSenderNode::SyncPolicy ReceiverGetDefaultSyncPolicy() const
|
||||||
|
{return default_sync_policy;}
|
||||||
|
void ReceiverSetDefaultSyncPolicy(NormSenderNode::SyncPolicy syncPolicy)
|
||||||
|
{default_sync_policy = syncPolicy;}
|
||||||
|
|
||||||
|
// Set default "max_pending_range" of NormObjects for reception
|
||||||
|
void SetRxCacheMax(UINT16 maxCount)
|
||||||
|
{rx_cache_count_max = maxCount;}
|
||||||
|
UINT16 GetRxCacheMax() const
|
||||||
|
{return rx_cache_count_max;}
|
||||||
|
|
||||||
// Debug settings
|
// Debug settings
|
||||||
void SetTrace(bool state) {trace = state;}
|
void SetTrace(bool state) {trace = state;}
|
||||||
void SetTxLoss(double percent) {tx_loss_rate = percent;}
|
void SetTxLoss(double percent) {tx_loss_rate = percent;}
|
||||||
void SetRxLoss(double percent) {rx_loss_rate = percent;}
|
void SetRxLoss(double percent) {rx_loss_rate = percent;}
|
||||||
|
void SetReportTimerInterval(double interval) {report_timer.SetInterval(interval);}
|
||||||
|
double GetReportTimerInterval() {return report_timer.GetInterval();}
|
||||||
|
|
||||||
#ifdef SIMULATE
|
#ifdef SIMULATE
|
||||||
// Simulation specific methods
|
// Simulation specific methods
|
||||||
|
|
@ -385,6 +535,8 @@ class NormSession
|
||||||
const ProtoAddress& src, bool unicast);
|
const ProtoAddress& src, bool unicast);
|
||||||
#endif // SIMULATE
|
#endif // SIMULATE
|
||||||
|
|
||||||
|
void SetProbeCount(unsigned probeCount) {probe_count = probeCount;}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Only NormSessionMgr can create/delete sessions
|
// Only NormSessionMgr can create/delete sessions
|
||||||
NormSession(NormSessionMgr& sessionMgr, NormNodeId localNodeId);
|
NormSession(NormSessionMgr& sessionMgr, NormNodeId localNodeId);
|
||||||
|
|
@ -394,26 +546,34 @@ class NormSession
|
||||||
bool QueueTxObject(NormObject* obj);
|
bool QueueTxObject(NormObject* obj);
|
||||||
|
|
||||||
|
|
||||||
|
double GetProbeInterval();
|
||||||
|
|
||||||
bool OnTxTimeout(ProtoTimer& theTimer);
|
bool OnTxTimeout(ProtoTimer& theTimer);
|
||||||
bool OnRepairTimeout(ProtoTimer& theTimer);
|
bool OnRepairTimeout(ProtoTimer& theTimer);
|
||||||
bool OnFlushTimeout(ProtoTimer& theTimer);
|
bool OnFlushTimeout(ProtoTimer& theTimer);
|
||||||
bool OnProbeTimeout(ProtoTimer& theTimer);
|
bool OnProbeTimeout(ProtoTimer& theTimer);
|
||||||
bool OnReportTimeout(ProtoTimer& theTimer);
|
bool OnReportTimeout(ProtoTimer& theTimer);
|
||||||
|
bool OnCmdTimeout(ProtoTimer& theTimer);
|
||||||
|
bool OnFlowControlTimeout(ProtoTimer& theTimer);
|
||||||
|
|
||||||
void TxSocketRecvHandler(ProtoSocket& theSocket, ProtoSocket::Event theEvent);
|
void TxSocketRecvHandler(ProtoSocket& theSocket, ProtoSocket::Event theEvent);
|
||||||
void RxSocketRecvHandler(ProtoSocket& theSocket, ProtoSocket::Event theEve);
|
void RxSocketRecvHandler(ProtoSocket& theSocket, ProtoSocket::Event theEvent);
|
||||||
void HandleReceiveMessage(NormMsg& msg, bool wasUnicast);
|
void HandleReceiveMessage(NormMsg& msg, bool wasUnicast, bool ecn = false);
|
||||||
|
|
||||||
// Server message handling routines
|
// This is used when raw packet capture is enabled
|
||||||
void ServerHandleNackMessage(const struct timeval& currentTime,
|
void OnPktCapture(ProtoChannel& theChannel,
|
||||||
|
ProtoChannel::Notification notifyType);
|
||||||
|
|
||||||
|
// Sender message handling routines
|
||||||
|
void SenderHandleNackMessage(const struct timeval& currentTime,
|
||||||
NormNackMsg& nack);
|
NormNackMsg& nack);
|
||||||
void ServerHandleAckMessage(const struct timeval& currentTime,
|
void SenderHandleAckMessage(const struct timeval& currentTime,
|
||||||
const NormAckMsg& ack,
|
const NormAckMsg& ack,
|
||||||
bool wasUnicast);
|
bool wasUnicast);
|
||||||
void ServerUpdateGrttEstimate(double clientRtt);
|
void SenderUpdateGrttEstimate(double rcvrRtt);
|
||||||
double CalculateRtt(const struct timeval& currentTime,
|
double CalculateRtt(const struct timeval& currentTime,
|
||||||
const struct timeval& grttResponse);
|
const struct timeval& grttResponse);
|
||||||
void ServerHandleCCFeedback(struct timeval currentTime,
|
void SenderHandleCCFeedback(struct timeval currentTime,
|
||||||
NormNodeId nodeId,
|
NormNodeId nodeId,
|
||||||
UINT8 ccFlags,
|
UINT8 ccFlags,
|
||||||
double ccRtt,
|
double ccRtt,
|
||||||
|
|
@ -422,27 +582,39 @@ class NormSession
|
||||||
UINT16 ccSequence);
|
UINT16 ccSequence);
|
||||||
void AdjustRate(bool onResponse);
|
void AdjustRate(bool onResponse);
|
||||||
void SetTxRateInternal(double txRate); // here, txRate is bytes/sec
|
void SetTxRateInternal(double txRate); // here, txRate is bytes/sec
|
||||||
bool ServerQueueSquelch(NormObjectId objectId);
|
bool SenderQueueSquelch(NormObjectId objectId);
|
||||||
void ServerQueueFlush();
|
void SenderQueueFlush();
|
||||||
bool ServerQueueWatermarkFlush();
|
bool SenderQueueWatermarkFlush();
|
||||||
bool ServerBuildRepairAdv(NormCmdRepairAdvMsg& cmd);
|
bool SenderBuildRepairAdv(NormCmdRepairAdvMsg& cmd);
|
||||||
void ServerUpdateGroupSize();
|
void SenderUpdateGroupSize();
|
||||||
|
bool SenderQueueAppCmd();
|
||||||
|
|
||||||
// Client message handling routines
|
// Receiver message handling routines
|
||||||
void ClientHandleObjectMessage(const struct timeval& currentTime,
|
void ReceiverHandleObjectMessage(const struct timeval& currentTime,
|
||||||
const NormObjectMsg& msg);
|
const NormObjectMsg& msg,
|
||||||
void ClientHandleCommand(const struct timeval& currentTime,
|
bool ecnStatus);
|
||||||
const NormCmdMsg& msg);
|
void ReceiverHandleCommand(const struct timeval& currentTime,
|
||||||
void ClientHandleNackMessage(const NormNackMsg& nack);
|
const NormCmdMsg& msg,
|
||||||
void ClientHandleAckMessage(const NormAckMsg& ack);
|
bool ecnStatus);
|
||||||
|
void ReceiverHandleNackMessage(const NormNackMsg& nack);
|
||||||
|
void ReceiverHandleAckMessage(const NormAckMsg& ack);
|
||||||
|
|
||||||
NormSessionMgr& session_mgr;
|
NormSessionMgr& session_mgr;
|
||||||
bool notify_pending;
|
bool notify_pending;
|
||||||
ProtoTimer tx_timer;
|
ProtoTimer tx_timer;
|
||||||
UINT16 tx_port;
|
UINT16 tx_port;
|
||||||
|
bool tx_port_reuse;
|
||||||
|
ProtoAddress tx_address; // bind tx_socket to tx_address when valid
|
||||||
ProtoSocket tx_socket_actual;
|
ProtoSocket tx_socket_actual;
|
||||||
ProtoSocket* tx_socket;
|
ProtoSocket* tx_socket;
|
||||||
ProtoSocket rx_socket;
|
ProtoSocket rx_socket;
|
||||||
|
ProtoCap* rx_cap; // raw packet capture alternative to "rx_socket"
|
||||||
|
bool rx_port_reuse; // enable rx_socket port (sessionPort) reuse when true
|
||||||
|
ProtoAddress rx_bind_addr;
|
||||||
|
ProtoAddress rx_connect_addr;
|
||||||
|
|
||||||
|
|
||||||
|
ProtoAddressList dst_addr_list; // list of local addresses
|
||||||
NormMessageQueue message_queue;
|
NormMessageQueue message_queue;
|
||||||
NormMessageQueue message_pool;
|
NormMessageQueue message_pool;
|
||||||
ProtoTimer report_timer;
|
ProtoTimer report_timer;
|
||||||
|
|
@ -450,20 +622,22 @@ class NormSession
|
||||||
|
|
||||||
// General session parameters
|
// General session parameters
|
||||||
NormNodeId local_node_id;
|
NormNodeId local_node_id;
|
||||||
ProtoAddress address; // session destination address & port
|
ProtoAddress address; // session destination address/port
|
||||||
UINT8 ttl; // session multicast ttl
|
UINT8 ttl; // session multicast ttl
|
||||||
UINT8 tos; // session IPv4 TOS (or IPv6 traffic class - TBD)
|
UINT8 tos; // session IPv4 TOS (or IPv6 traffic class - TBD)
|
||||||
bool loopback; // to receive own traffic
|
bool loopback; // receive own traffic it true
|
||||||
bool rx_port_reuse; // enable rx_socket port (sessionPort) reuse when true
|
bool fragmentation; // enable UDP/IP fragmentation (i.e. clear DF bit) if true
|
||||||
bool rx_addr_bind; // bind rx_socket to sessionAddr when true
|
bool ecn_enabled; // set true to get raw packets and check for ECN status
|
||||||
char interface_name[32];
|
|
||||||
|
char interface_name[IFACE_NAME_MAX+1];
|
||||||
double tx_rate; // bytes per second
|
double tx_rate; // bytes per second
|
||||||
double tx_rate_min;
|
double tx_rate_min;
|
||||||
double tx_rate_max;
|
double tx_rate_max;
|
||||||
double backoff_factor;
|
|
||||||
|
|
||||||
// Server parameters and state
|
|
||||||
bool is_server;
|
// Sender parameters and state
|
||||||
|
double backoff_factor;
|
||||||
|
bool is_sender;
|
||||||
int tx_robust_factor;
|
int tx_robust_factor;
|
||||||
UINT16 instance_id;
|
UINT16 instance_id;
|
||||||
UINT16 segment_size;
|
UINT16 segment_size;
|
||||||
|
|
@ -472,6 +646,8 @@ class NormSession
|
||||||
UINT16 auto_parity;
|
UINT16 auto_parity;
|
||||||
UINT16 extra_parity;
|
UINT16 extra_parity;
|
||||||
bool sndr_emcon;
|
bool sndr_emcon;
|
||||||
|
bool tx_only;
|
||||||
|
bool tx_connect;
|
||||||
|
|
||||||
NormObjectTable tx_table;
|
NormObjectTable tx_table;
|
||||||
ProtoSlidingMask tx_pending_mask;
|
ProtoSlidingMask tx_pending_mask;
|
||||||
|
|
@ -480,6 +656,8 @@ class NormSession
|
||||||
NormBlockPool block_pool;
|
NormBlockPool block_pool;
|
||||||
NormSegmentPool segment_pool;
|
NormSegmentPool segment_pool;
|
||||||
NormEncoder* encoder;
|
NormEncoder* encoder;
|
||||||
|
UINT8 fec_id;
|
||||||
|
UINT8 fec_m;
|
||||||
|
|
||||||
NormObjectId next_tx_object_id;
|
NormObjectId next_tx_object_id;
|
||||||
unsigned int tx_cache_count_min;
|
unsigned int tx_cache_count_min;
|
||||||
|
|
@ -488,12 +666,15 @@ class NormSession
|
||||||
ProtoTimer flush_timer;
|
ProtoTimer flush_timer;
|
||||||
int flush_count;
|
int flush_count;
|
||||||
bool posted_tx_queue_empty;
|
bool posted_tx_queue_empty;
|
||||||
|
bool posted_tx_rate_changed;
|
||||||
|
|
||||||
// For postive acknowledgement collection
|
// For postive acknowledgement collection
|
||||||
NormNodeTree acking_node_tree;
|
NormNodeTree acking_node_tree;
|
||||||
unsigned int acking_node_count;
|
unsigned int acking_node_count;
|
||||||
unsigned int acking_success_count;
|
unsigned int acking_success_count;
|
||||||
|
TrackingStatus acking_auto_populate; // whether / how to "auto populate" acking node list
|
||||||
bool watermark_pending;
|
bool watermark_pending;
|
||||||
|
bool watermark_flushes;
|
||||||
bool watermark_active;
|
bool watermark_active;
|
||||||
NormObjectId watermark_object_id;
|
NormObjectId watermark_object_id;
|
||||||
NormBlockId watermark_block_id;
|
NormBlockId watermark_block_id;
|
||||||
|
|
@ -533,31 +714,52 @@ class NormSession
|
||||||
UINT8 gsize_quantized;
|
UINT8 gsize_quantized;
|
||||||
|
|
||||||
// Sender congestion control parameters
|
// Sender congestion control parameters
|
||||||
|
unsigned int probe_count; // for experimentation (cc probes per rtt)
|
||||||
bool cc_enable;
|
bool cc_enable;
|
||||||
UINT8 cc_sequence;
|
bool cc_adjust;
|
||||||
|
UINT16 cc_sequence;
|
||||||
NormNodeList cc_node_list;
|
NormNodeList cc_node_list;
|
||||||
bool cc_slow_start;
|
bool cc_slow_start;
|
||||||
bool cc_active;
|
bool cc_active;
|
||||||
unsigned long sent_accumulator; // for sentRate measurement
|
NormNode::Accumulator sent_accumulator; // for sentRate measurement
|
||||||
double nominal_packet_size;
|
double nominal_packet_size;
|
||||||
bool data_active; // true when actively sending data
|
bool data_active; // true when actively sending data
|
||||||
|
double flow_control_factor;
|
||||||
|
ProtoTimer flow_control_timer;
|
||||||
|
NormObjectId flow_control_object;
|
||||||
|
NormController::Event flow_control_event;
|
||||||
|
|
||||||
|
// Sender "app-defined" command state
|
||||||
|
unsigned int cmd_count;
|
||||||
|
char* cmd_buffer;
|
||||||
|
unsigned int cmd_length;
|
||||||
|
ProtoTimer cmd_timer;
|
||||||
|
|
||||||
// Receiver parameters
|
// Receiver parameters
|
||||||
bool is_client;
|
bool is_receiver;
|
||||||
int rx_robust_factor;
|
int rx_robust_factor;
|
||||||
NormNodeTree server_tree;
|
NormSenderNode* preset_sender;
|
||||||
unsigned long remote_server_buffer_size;
|
NormNodeTree sender_tree;
|
||||||
|
unsigned long remote_sender_buffer_size;
|
||||||
bool unicast_nacks;
|
bool unicast_nacks;
|
||||||
bool client_silent;
|
bool receiver_silent;
|
||||||
bool rcvr_ignore_info;
|
bool rcvr_ignore_info;
|
||||||
INT32 rcvr_max_delay;
|
INT32 rcvr_max_delay;
|
||||||
NormServerNode::RepairBoundary default_repair_boundary;
|
bool rcvr_realtime;
|
||||||
|
NormSenderNode::RepairBoundary default_repair_boundary;
|
||||||
NormObject::NackingMode default_nacking_mode;
|
NormObject::NackingMode default_nacking_mode;
|
||||||
|
NormSenderNode::SyncPolicy default_sync_policy;
|
||||||
|
UINT16 rx_cache_count_max;
|
||||||
|
|
||||||
|
// State for some experimental congestion control
|
||||||
|
bool ecn_ignore_loss;
|
||||||
|
bool cc_tolerate_loss;
|
||||||
|
|
||||||
// Protocol test/debug parameters
|
// Protocol test/debug parameters
|
||||||
bool trace;
|
bool trace;
|
||||||
double tx_loss_rate; // for correlated loss
|
double tx_loss_rate; // for correlated loss
|
||||||
double rx_loss_rate; // for uncorrelated loss
|
double rx_loss_rate; // for uncorrelated loss
|
||||||
|
double report_timer_interval;
|
||||||
|
|
||||||
const void* user_data;
|
const void* user_data;
|
||||||
|
|
||||||
|
|
@ -565,5 +767,11 @@ class NormSession
|
||||||
NormSession* next;
|
NormSession* next;
|
||||||
}; // end class NormSession
|
}; // end class NormSession
|
||||||
|
|
||||||
|
// This function prints out NORM message info
|
||||||
|
void NormTrace(const struct timeval& currentTime,
|
||||||
|
NormNodeId localId,
|
||||||
|
const NormMsg& msg,
|
||||||
|
bool sent,
|
||||||
|
UINT8 fecM);
|
||||||
|
|
||||||
#endif // _NORM_SESSION
|
#endif // _NORM_SESSION
|
||||||
|
|
@ -15,15 +15,23 @@ class NormSimAgent : public NormController, public ProtoMessageSink
|
||||||
|
|
||||||
bool ProcessCommand(const char* cmd, const char* val);
|
bool ProcessCommand(const char* cmd, const char* val);
|
||||||
|
|
||||||
// Note: don't allow client _and_ server operation at same time
|
// Note: don't allow receiver _and_ sender operation at same time
|
||||||
bool StartServer(); // start sender
|
bool StartSender(); // start sender
|
||||||
bool StartClient(); // start receiver
|
bool StartReceiver(); // start receiver
|
||||||
bool IsActive() {return (NULL != session);}
|
bool IsActive() {return (NULL != session);}
|
||||||
void Stop();
|
void Stop();
|
||||||
|
|
||||||
|
|
||||||
bool SendMessage(unsigned int len, const char* txBuffer);
|
bool SendMessage(unsigned int len, const char* txBuffer);
|
||||||
|
|
||||||
|
enum NormCC
|
||||||
|
{
|
||||||
|
NORM_FIXED, // fixed-rate (no congestion control)
|
||||||
|
NORM_CC, // "normal" TCP-friendly congestion control
|
||||||
|
NORM_CCE, // strict ECN-based congestion control
|
||||||
|
NORM_CCL // "loss-tolerant" congestion control
|
||||||
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
NormSimAgent(ProtoTimerMgr& timerMgr,
|
NormSimAgent(ProtoTimerMgr& timerMgr,
|
||||||
ProtoSocket::Notifier& socketNotifier);
|
ProtoSocket::Notifier& socketNotifier);
|
||||||
|
|
@ -45,7 +53,7 @@ class NormSimAgent : public NormController, public ProtoMessageSink
|
||||||
virtual void Notify(NormController::Event event,
|
virtual void Notify(NormController::Event event,
|
||||||
class NormSessionMgr* sessionMgr,
|
class NormSessionMgr* sessionMgr,
|
||||||
class NormSession* session,
|
class NormSession* session,
|
||||||
class NormServerNode* server,
|
class NormSenderNode* sender,
|
||||||
class NormObject* object);
|
class NormObject* object);
|
||||||
|
|
||||||
void ActivateTimer(ProtoTimer& theTimer)
|
void ActivateTimer(ProtoTimer& theTimer)
|
||||||
|
|
@ -53,6 +61,8 @@ class NormSimAgent : public NormController, public ProtoMessageSink
|
||||||
|
|
||||||
bool OnIntervalTimeout(ProtoTimer& theTimer);
|
bool OnIntervalTimeout(ProtoTimer& theTimer);
|
||||||
|
|
||||||
|
void SetCCMode(NormCC ccMode);
|
||||||
|
|
||||||
static const char* const cmd_list[];
|
static const char* const cmd_list[];
|
||||||
|
|
||||||
NormSessionMgr session_mgr;
|
NormSessionMgr session_mgr;
|
||||||
|
|
@ -63,9 +73,12 @@ class NormSimAgent : public NormController, public ProtoMessageSink
|
||||||
UINT16 port; // session port number
|
UINT16 port; // session port number
|
||||||
UINT8 ttl;
|
UINT8 ttl;
|
||||||
double tx_rate; // bits/sec
|
double tx_rate; // bits/sec
|
||||||
|
unsigned int probe_count;
|
||||||
bool cc_enable;
|
bool cc_enable;
|
||||||
|
bool ecn_enable;
|
||||||
|
NormCC cc_mode;
|
||||||
bool unicast_nacks;
|
bool unicast_nacks;
|
||||||
bool silent_client;
|
bool silent_receiver;
|
||||||
double backoff_factor;
|
double backoff_factor;
|
||||||
UINT16 segment_size;
|
UINT16 segment_size;
|
||||||
UINT8 ndata;
|
UINT8 ndata;
|
||||||
|
|
@ -75,7 +88,12 @@ class NormSimAgent : public NormController, public ProtoMessageSink
|
||||||
double group_size;
|
double group_size;
|
||||||
double grtt_estimate;
|
double grtt_estimate;
|
||||||
unsigned long tx_buffer_size; // bytes
|
unsigned long tx_buffer_size; // bytes
|
||||||
|
unsigned long tx_cache_min;
|
||||||
|
unsigned long tx_cache_max;
|
||||||
|
NormObjectSize tx_cache_size;
|
||||||
|
|
||||||
unsigned long rx_buffer_size; // bytes
|
unsigned long rx_buffer_size; // bytes
|
||||||
|
unsigned long rx_cache_max; // rx object max_pending count
|
||||||
|
|
||||||
// for simulated transmission (streams or files)
|
// for simulated transmission (streams or files)
|
||||||
unsigned long tx_object_size;
|
unsigned long tx_object_size;
|
||||||
|
|
@ -84,6 +102,8 @@ class NormSimAgent : public NormController, public ProtoMessageSink
|
||||||
unsigned long tx_object_size_max;
|
unsigned long tx_object_size_max;
|
||||||
int tx_repeat_count;
|
int tx_repeat_count;
|
||||||
double tx_repeat_interval;
|
double tx_repeat_interval;
|
||||||
|
int tx_requeue;
|
||||||
|
int tx_requeue_count;
|
||||||
|
|
||||||
NormStreamObject* stream;
|
NormStreamObject* stream;
|
||||||
bool auto_stream;
|
bool auto_stream;
|
||||||
|
|
@ -100,6 +120,7 @@ class NormSimAgent : public NormController, public ProtoMessageSink
|
||||||
|
|
||||||
// protocol debug parameters
|
// protocol debug parameters
|
||||||
bool tracing;
|
bool tracing;
|
||||||
|
FILE* log_file_ptr;
|
||||||
double tx_loss;
|
double tx_loss;
|
||||||
double rx_loss;
|
double rx_loss;
|
||||||
|
|
||||||
|
|
@ -32,6 +32,6 @@
|
||||||
|
|
||||||
#ifndef _NORM_VERSION
|
#ifndef _NORM_VERSION
|
||||||
#define _NORM_VERSION
|
#define _NORM_VERSION
|
||||||
#define VERSION "1.4b3a"
|
#define VERSION "1.5b1"
|
||||||
#endif // _NORM_VERSION
|
#endif // _NORM_VERSION
|
||||||
|
|
||||||
|
|
@ -50,6 +50,7 @@ SYSTEM = arm-linux
|
||||||
CC = arm-linux-g++
|
CC = arm-linux-g++
|
||||||
SYSTEM_CFLAGS = -Wall -Wcast-align -pedantic -fPIC
|
SYSTEM_CFLAGS = -Wall -Wcast-align -pedantic -fPIC
|
||||||
SYSTEM_SOFLAGS = -shared
|
SYSTEM_SOFLAGS = -shared
|
||||||
|
SYSTEM_SOEXT = so
|
||||||
RANLIB = arm-linux-ranlib
|
RANLIB = arm-linux-ranlib
|
||||||
AR = arm-linux-ar
|
AR = arm-linux-ar
|
||||||
|
|
||||||
|
|
@ -0,0 +1,243 @@
|
||||||
|
#########################################################################
|
||||||
|
# COMMON NORM MAKEFILE STUFF
|
||||||
|
#
|
||||||
|
|
||||||
|
SHELL=/bin/sh
|
||||||
|
|
||||||
|
.SUFFIXES: .cpp -sim.o $(.SUFFIXES)
|
||||||
|
|
||||||
|
PROTOLIB = ../protolib
|
||||||
|
COMMON = ../src/common
|
||||||
|
UNIX = ../src/unix
|
||||||
|
EXAMPLE = ../examples
|
||||||
|
NS = ../src/sim/ns
|
||||||
|
|
||||||
|
INCLUDES = $(SYSTEM_INCLUDES) -I$(UNIX) -I../include -I$(PROTOLIB)/include
|
||||||
|
|
||||||
|
CFLAGS = -g -DPROTO_DEBUG -DUNIX -D_FILE_OFFSET_BITS=64 -O $(SYSTEM_CFLAGS) $(SYSTEM_HAVES) $(INCLUDES)
|
||||||
|
|
||||||
|
LDFLAGS = $(SYSTEM_LDFLAGS)
|
||||||
|
|
||||||
|
# Note: Even command line app needs X11 for Netscape post-processing
|
||||||
|
LIBS = $(SYSTEM_LIBS) -lm -lpthread
|
||||||
|
XLIBS = -lXmu -lXt -lX11
|
||||||
|
|
||||||
|
|
||||||
|
TARGETS = norm raft
|
||||||
|
|
||||||
|
# Rule for C++ .cpp extension
|
||||||
|
.cpp.o:
|
||||||
|
$(CC) -c $(CFLAGS) -o $*.o $*.cpp
|
||||||
|
|
||||||
|
# NORM depends upon the NRL Protean Group's development library
|
||||||
|
LIBPROTO = $(PROTOLIB)/lib/libprotokit.a
|
||||||
|
|
||||||
|
NORM_SRC = $(COMMON)/normMessage.cpp $(COMMON)/normSession.cpp \
|
||||||
|
$(COMMON)/normNode.cpp $(COMMON)/normObject.cpp \
|
||||||
|
$(COMMON)/normSegment.cpp $(COMMON)/normEncoder.cpp \
|
||||||
|
$(COMMON)/normEncoderRS8.cpp $(COMMON)/normEncoderRS16.cpp \
|
||||||
|
$(COMMON)/normEncoderMDP.cpp $(COMMON)/galois.cpp \
|
||||||
|
$(COMMON)/normFile.cpp $(COMMON)/normApi.cpp $(SYSTEM_SRC)
|
||||||
|
|
||||||
|
NORM_OBJ = $(NORM_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
LIB_SRC = $(NORM_SRC)
|
||||||
|
LIB_OBJ = $(LIB_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
all: norm raft libnorm.a
|
||||||
|
|
||||||
|
$(PROTOLIB)/lib/libprotokit.a:
|
||||||
|
$(MAKE) -C $(PROTOLIB)/makefiles -f Makefile.$(SYSTEM) libprotokit.a
|
||||||
|
|
||||||
|
# NORM as a static library
|
||||||
|
libnorm.a: $(LIB_OBJ)
|
||||||
|
rm -f $@
|
||||||
|
$(AR) rcv $@ $(LIB_OBJ)
|
||||||
|
$(RANLIB) $@
|
||||||
|
mkdir -p ../lib
|
||||||
|
cp $@ ../lib/$@
|
||||||
|
|
||||||
|
# NORM as a shared library (i.e. libnorm.so, libnorm.dylib, etc)
|
||||||
|
# (Note - we are linking "libprotokit" in statically
|
||||||
|
libnorm.$(SYSTEM_SOEXT): $(LIB_OBJ) $(LIBPROTO)
|
||||||
|
$(CC) $(SYSTEM_SOFLAGS) $(LIB_OBJ) $(LIBPROTO) $(LIBS) -o $@
|
||||||
|
mkdir -p ../lib
|
||||||
|
cp $@ ../lib/$@
|
||||||
|
|
||||||
|
SIM_SRC = $(NORM_SRC) $(COMMON)/normSimAgent.cpp
|
||||||
|
SIM_OBJ = $(SIM_SRC:.cpp=-sim.o)
|
||||||
|
|
||||||
|
libnormsim.a: $(SIM_OBJ)
|
||||||
|
rm -f $@
|
||||||
|
$(AR) rcv $@ $(SIM_OBJ)
|
||||||
|
$(RANLIB) $@
|
||||||
|
|
||||||
|
# (norm) command-line file broadcaster/receiver
|
||||||
|
APP_SRC = $(COMMON)/normApp.cpp $(COMMON)/normPostProcess.cpp \
|
||||||
|
$(UNIX)/unixPostProcess.cpp
|
||||||
|
APP_OBJ = $(APP_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
norm: $(APP_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(APP_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
|
||||||
|
# This section builds some of code "examples" that use the NORM API
|
||||||
|
|
||||||
|
# NORM_OBJECT_FILE sender example
|
||||||
|
FSEND_SRC = $(EXAMPLE)/normFileSend.cpp
|
||||||
|
FSEND_OBJ = $(FSEND_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
normFileSend: $(FSEND_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(FSEND_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# NORM_OBJECT_FILE receiver example
|
||||||
|
FRECV_SRC = $(EXAMPLE)/normFileRecv.cpp
|
||||||
|
FRECV_OBJ = $(FRECV_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
normFileRecv: $(FRECV_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(FRECV_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
|
||||||
|
# NORM_OBJECT_DATA sender example
|
||||||
|
DSEND_SRC = $(EXAMPLE)/normDataSend.cpp
|
||||||
|
DSEND_OBJ = $(DSEND_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
normDataSend: $(DSEND_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(DSEND_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# NORM_OBJECT_DATA receiver example
|
||||||
|
DRECV_SRC = $(EXAMPLE)/normDataRecv.cpp
|
||||||
|
DRECV_OBJ = $(DRECV_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
normDataRecv: $(DRECV_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(DRECV_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
|
||||||
|
# NORM_OBJECT_STREAM sender example
|
||||||
|
SSEND_SRC = $(EXAMPLE)/normStreamSend.cpp
|
||||||
|
SSEND_OBJ = $(SSEND_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
normStreamSend: $(SSEND_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(SSEND_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
|
||||||
|
# NORM_OBJECT_STREAM receiver example
|
||||||
|
SRECV_SRC = $(EXAMPLE)/normStreamRecv.cpp
|
||||||
|
SRECV_OBJ = $(SRECV_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
normStreamRecv: $(SRECV_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(SRECV_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
|
||||||
|
# (normTest) test of NORM API
|
||||||
|
TEST_SRC = $(COMMON)/normTest.cpp
|
||||||
|
TEST_OBJ = $(TEST_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
normTest: $(TEST_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(TEST_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# (normThreadTest) test of threaded use of NORM API
|
||||||
|
TTEST_SRC = $(COMMON)/normThreadTest.cpp
|
||||||
|
TTEST_OBJ = $(TTEST_SRC:.cpp=.o)
|
||||||
|
normThreadTest: $(TTEST_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(TTEST_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# (normThreadTest2) alt test of threaded use of NORM API
|
||||||
|
TTEST2_SRC = $(UNIX)/normThreadTest2.cpp
|
||||||
|
TTEST2_OBJ = $(TTEST2_SRC:.cpp=.o)
|
||||||
|
normThreadTest2: $(TTEST2_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(TTEST2_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# (pcap2norm) - parses pcap (e.g. tcpdump) file and prints NORM trace
|
||||||
|
PCAP_SRC = $(COMMON)/pcap2norm.cpp
|
||||||
|
PCAP_OBJ = $(PCAP_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
pcap2norm: $(PCAP_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(PCAP_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# (n2m) - converts NORM "trace" to MGEN log format to enable TRPR (or other) analyses
|
||||||
|
N2M_SRC = $(COMMON)/n2m.cpp
|
||||||
|
N2M_OBJ = $(N2M_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
n2m: $(N2M_OBJ)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(N2M_OBJ) $(LDFLAGS) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# (npc) NORM Pre-Coder
|
||||||
|
PCODE_SRC = $(COMMON)/normPrecode.cpp
|
||||||
|
PCODE_OBJ = $(PCODE_SRC:.cpp=.o)
|
||||||
|
npc: $(PCODE_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(PCODE_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# (raft) reliable app for tunnel (command-line reliable UDP tunnel)
|
||||||
|
RAFT_SRC = $(COMMON)/raft.cpp
|
||||||
|
RAFT_OBJ = $(RAFT_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
raft: $(RAFT_OBJ) $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(RAFT_OBJ) $(LDFLAGS) $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# (ntun) IP/NORM tunnel app using ProtoVif
|
||||||
|
NTUN_SRC = $(COMMON)/ntun.cpp $(PROTOLIB)/common/protoVif.cpp $(PROTOLIB)/unix/unixVif.cpp
|
||||||
|
NTUN_OBJ = $(NTUN_SRC:.cpp=.o)
|
||||||
|
|
||||||
|
ntun: $(NTUN_OBJ) $(LIBPROTO) libnorm.a
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(NTUN_OBJ) $(LDFLAGS) libnorm.a $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# (fect) fec tester code
|
||||||
|
FECT_SRC = $(COMMON)/fecTest.cpp $(COMMON)/normEncoder.cpp $(COMMON)/galois.cpp \
|
||||||
|
$(COMMON)/normEncoderRS8.cpp $(COMMON)/normEncoderRS16.cpp
|
||||||
|
FECT_OBJ = $(FECT_SRC:.cpp=.o)
|
||||||
|
fect: $(FECT_OBJ) libnorm.a $(LIBPROTO)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(FECT_OBJ) $(LDFLAGS) $(LIBPROTO) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
# (gtf) generate test file
|
||||||
|
GTF_SRC = $(COMMON)/gtf.cpp
|
||||||
|
GTF_OBJ = $(GTF_SRC:.cpp=.o)
|
||||||
|
gtf: $(GTF_OBJ)
|
||||||
|
$(CC) $(CFLAGS) -o $@ $(GTF_OBJ) $(LDFLAGS) $(LIBS)
|
||||||
|
mkdir -p ../bin
|
||||||
|
cp $@ ../bin/$@
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(COMMON)/*.o $(UNIX)/*.o $(NS)/*.o \
|
||||||
|
libnorm.a libnorm.$(SYSTEM_SOEXT) ../lib/libnorm.a ../lib/libnorm.$(SYSTEM_SOEXT) \
|
||||||
|
norm raft normTest normTest2 normThreadTest normThreadTest2 ../bin/*;
|
||||||
|
$(MAKE) -C $(PROTOLIB)/makefiles -f Makefile.$(SYSTEM) clean
|
||||||
|
distclean: clean
|
||||||
|
|
||||||
|
# DO NOT DELETE THIS LINE -- mkdep uses it.
|
||||||
|
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
|
||||||
|
|
||||||
|
|
@ -40,7 +40,7 @@ SYSTEM_HAVES = -DHAVE_IPV6 -DHAVE_ASSERT -DHAVE_GETLOGIN -DHAVE_FLOCK -DHAVE_DI
|
||||||
SYSTEM_SRC =
|
SYSTEM_SRC =
|
||||||
|
|
||||||
SYSTEM = freebsd
|
SYSTEM = freebsd
|
||||||
CC = gcc
|
CC = g++
|
||||||
SYSTEM_CFLAGS = -fPIC -Wall -pedantic -Wcast-align
|
SYSTEM_CFLAGS = -fPIC -Wall -pedantic -Wcast-align
|
||||||
SYSTEM_SOFLAGS = -shared
|
SYSTEM_SOFLAGS = -shared
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
#
|
||||||
|
# Protean MacOS X (Darwin) Makefile definitions
|
||||||
|
#
|
||||||
|
|
||||||
|
SDK = /Developer/Platforms/iPhoneOS.platform/Developer
|
||||||
|
ARCH = armv6
|
||||||
|
SYSROOT = $(SDK)/SDKs/iPhoneOS2.2.1.sdk
|
||||||
|
|
||||||
|
# 1) System specific additional libraries, include paths, etc
|
||||||
|
# (Where to find X11 libraries, etc)
|
||||||
|
#
|
||||||
|
|
||||||
|
SYSTEM_INCLUDES =
|
||||||
|
SYSTEM_LDFLAGS = -L$(SYSROOT)/usr/lib
|
||||||
|
SYSTEM_LIBS = -lresolv
|
||||||
|
|
||||||
|
# 2) System specific capabilities
|
||||||
|
# Must choose appropriate for the following:
|
||||||
|
#
|
||||||
|
# A) -DHAVE_CUSERID (preferred) or -DHAVE_GETLOGIN for cuserid() or getlogin()
|
||||||
|
# functions to obtain user's login name (We may change this to getpwd()
|
||||||
|
# if that is better across different platforms and login environments)
|
||||||
|
#
|
||||||
|
# B) -DHAVE_LOCKF (preferred) or -D_LOCKF for lockf() or flock() file locking
|
||||||
|
# functions to attempt exclusive lock on writing to files
|
||||||
|
#
|
||||||
|
# C) Specify -DHAVE_DIRFD if you system provides the "dirfd()" function
|
||||||
|
# (Most don't have it defined ... but some do)
|
||||||
|
#
|
||||||
|
# D) Optionally specify -DHAVE_ASSERT if your system has a built-in ASSERT()
|
||||||
|
# routine.
|
||||||
|
#
|
||||||
|
# E) Some systems (SOLARIS/SUNOS) have a few gotchas which require
|
||||||
|
# some #ifdefs to avoid compiler warnings ... so you might need
|
||||||
|
# to specify -DSOLARIS or -DSUNOS depending on your OS.
|
||||||
|
#
|
||||||
|
# F) Uncomment this if you have the NRL IPv6+IPsec software
|
||||||
|
#DNETSEC = -DNETSEC -I/usr/inet6/include
|
||||||
|
#
|
||||||
|
# (We export these for other Makefiles as needed)
|
||||||
|
#
|
||||||
|
|
||||||
|
SYSTEM_HAVES = -DMACOSX -DECN_SUPPORT -DHAVE_IPV6 -DHAVE_ASSERT -DHAVE_GETLOGIN -DHAVE_FLOCK \
|
||||||
|
-D_FILE_OFFSET_BITS=64 -DHAVE_DIRFD
|
||||||
|
|
||||||
|
SYSTEM_SRC = ../protolib/src/unix/bpfCap.cpp
|
||||||
|
|
||||||
|
# The "SYSTEM" keyword can be used for dependent makes
|
||||||
|
SYSTEM = iphone
|
||||||
|
|
||||||
|
CC = $(SDK)/usr/bin/arm-apple-darwin9-g++-4.0.1 -arch $(ARCH) -isysroot $(SYSROOT)
|
||||||
|
SYSTEM_CFLAGS = -Wall -Wcast-align -pedantic -fPIC -I$(SDK)/usr/include/gcc/darwin/4.0
|
||||||
|
SYSTEM_SOFLAGS = -dynamiclib
|
||||||
|
SYSTEM_SOEXT = dylib
|
||||||
|
RANLIB = $(SDK)/usr/bin/ranlib
|
||||||
|
AR = $(SDK)/usr/bin/ar
|
||||||
|
|
||||||
|
include Makefile.common
|
||||||
|
|
@ -35,16 +35,17 @@ SYSTEM_LIBS = -ldl
|
||||||
# (We export these for other Makefiles as needed)
|
# (We export these for other Makefiles as needed)
|
||||||
#
|
#
|
||||||
|
|
||||||
SYSTEM_HAVES = -DLINUX -DHAVE_IPV6 -DHAVE_GETLOGIN -D_FILE_OFFSET_BITS=64 -DHAVE_LOCKF \
|
SYSTEM_HAVES = -DLINUX -DECN_SUPPORT -DHAVE_IPV6 -DHAVE_GETLOGIN -D_FILE_OFFSET_BITS=64 -DHAVE_LOCKF \
|
||||||
-DHAVE_OLD_SIGNALHANDLER -DHAVE_DIRFD -DHAVE_ASSERT
|
-DHAVE_OLD_SIGNALHANDLER -DHAVE_DIRFD -DHAVE_ASSERT
|
||||||
|
|
||||||
SYSTEM_SRC =
|
SYSTEM_SRC = ../protolib/src/linux/linuxCap.cpp
|
||||||
|
|
||||||
SYSTEM = linux
|
SYSTEM = linux
|
||||||
|
|
||||||
export CC = g++
|
export CC = g++
|
||||||
export SYSTEM_CFLAGS = -fPIC -Wall -Wcast-align
|
export SYSTEM_CFLAGS = -fPIC -Wall -Wcast-align
|
||||||
export SYSTEM_SOFLAGS = -shared
|
export SYSTEM_SOFLAGS = -shared -Wl,-soname,libnorm.so.1
|
||||||
|
SYSTEM_SOEXT = so
|
||||||
export RANLIB = ranlib
|
export RANLIB = ranlib
|
||||||
export AR = ar
|
export AR = ar
|
||||||
|
|
||||||
|
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
SYSTEM_INCLUDES =
|
SYSTEM_INCLUDES =
|
||||||
SYSTEM_LDFLAGS =
|
SYSTEM_LDFLAGS =
|
||||||
SYSTEM_LIBS = -lresolv
|
SYSTEM_LIBS = -lresolv -lpcap
|
||||||
|
|
||||||
# 2) System specific capabilities
|
# 2) System specific capabilities
|
||||||
# Must choose appropriate for the following:
|
# Must choose appropriate for the following:
|
||||||
|
|
@ -36,17 +36,18 @@ SYSTEM_LIBS = -lresolv
|
||||||
# (We export these for other Makefiles as needed)
|
# (We export these for other Makefiles as needed)
|
||||||
#
|
#
|
||||||
|
|
||||||
SYSTEM_HAVES = -DMACOSX -DHAVE_IPV6 -DHAVE_ASSERT -DHAVE_GETLOGIN -DHAVE_FLOCK \
|
SYSTEM_HAVES = -DMACOSX -DECN_SUPPORT -DHAVE_IPV6 -DHAVE_ASSERT -DHAVE_GETLOGIN -DHAVE_FLOCK \
|
||||||
-D_FILE_OFFSET_BITS=64 -DHAVE_DIRFD
|
-D_FILE_OFFSET_BITS=64 -DHAVE_DIRFD
|
||||||
|
|
||||||
SYSTEM_SRC =
|
SYSTEM_SRC = ../protolib/src/unix/bpfCap.cpp
|
||||||
|
|
||||||
# The "SYSTEM" keyword can be used for dependent makes
|
# The "SYSTEM" keyword can be used for dependent makes
|
||||||
SYSTEM = macosx
|
SYSTEM = macosx
|
||||||
|
|
||||||
CC = g++
|
CC = g++
|
||||||
SYSTEM_CFLAGS = -fPIC -Wall -Wcast-align
|
SYSTEM_CFLAGS = -Wall -Wcast-align -fPIC -arch x86_64 -arch i386
|
||||||
SYSTEM_SOFLAGS = -dynamiclib
|
SYSTEM_SOFLAGS = -dynamiclib
|
||||||
|
SYSTEM_SOEXT = dylib
|
||||||
RANLIB = ranlib
|
RANLIB = ranlib
|
||||||
AR = ar
|
AR = ar
|
||||||
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="mil.navy.nrl.norm"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0">
|
||||||
|
<uses-sdk android:minSdkVersion="9"
|
||||||
|
android:targetSdkVersion="17"/>
|
||||||
|
</manifest>
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
This directory contains an Android NDK import module for NORM, which builds
|
||||||
|
a shared library, and the JNI bindings.
|
||||||
|
|
||||||
|
Using NORM in your pure Java Android Application
|
||||||
|
------------------------------------------------
|
||||||
|
|
||||||
|
1. First, update the library project to point to your Android SDK:
|
||||||
|
|
||||||
|
android update lib-project --target <id> --path /path/to/norm/makefiles/android
|
||||||
|
android update lib-project --target <id> --path /path/to/protolib/makefiles/android
|
||||||
|
|
||||||
|
Use "android list targets" to see the ids of the SDK targets you have
|
||||||
|
installed.
|
||||||
|
|
||||||
|
2. Add a "jni/Application.mk" in the root of your project to reference NORM:
|
||||||
|
* You must at least set "APP_MODULES := norm-jni"
|
||||||
|
* You should set "APP_BUILD_SCRIPT := /path/to/norm/makefiles/android/jni/Android.mk"
|
||||||
|
* You should also set "NDK_MODULE_PATH" to point to the base norm directory
|
||||||
|
so that the NDK can find protolib. See the example.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
APP_MODULES := mil_navy_nrl_norm
|
||||||
|
APP_ABI := all
|
||||||
|
APP_BUILD_SCRIPT := $(LOCAL_PATH)/../library/norm/makefiles/android/jni/Android.mk
|
||||||
|
|
||||||
|
NDK_MODULE_PATH := $(LOCAL_PATH)../library/norm/
|
||||||
|
|
||||||
|
3. Reference the NORM Android library project in your "project.properties"
|
||||||
|
file. Add the following:
|
||||||
|
|
||||||
|
android.library.reference.1=/path/to/norm/makefiles/android
|
||||||
|
|
||||||
|
Now, you should be able to run "ndk-build" in your root project directory to
|
||||||
|
build the shared libraries, and run "ant debug" to build your APK.
|
||||||
|
|
||||||
|
Using NORM in your C/C++/Java Android Application
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
1. Add a "jni/Application.mk" with your C/C++ code specified.
|
||||||
|
|
||||||
|
2. Reference the NORM Android project as an NDK Import Module. See
|
||||||
|
"IMPORT-MODULE.html" in the NDK docs.
|
||||||
|
|
||||||
|
Put something like the following at the bottom of your "Android.mk"
|
||||||
|
|
||||||
|
$(call import-module,norm/makefiles/android/jni)
|
||||||
|
|
||||||
|
This is relative to the "NDK_MODULE_PATH" variable that must be defined in
|
||||||
|
"Application.mk".
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
# This file is used to override default values used by the Ant build system.
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems, as it is
|
||||||
|
# integral to the build system of your project.
|
||||||
|
|
||||||
|
# This file is only used by the Ant script.
|
||||||
|
|
||||||
|
# You can use this to override default values such as
|
||||||
|
# 'source.dir' for the location of your java source folder and
|
||||||
|
# 'out.dir' for the location of your output folder.
|
||||||
|
|
||||||
|
# You can also use it define how the release builds are signed by declaring
|
||||||
|
# the following properties:
|
||||||
|
# 'key.store' for the location of your keystore and
|
||||||
|
# 'key.alias' for the name of the key to use.
|
||||||
|
# The password will be asked during the build when you use the 'release' target.
|
||||||
|
|
||||||
|
source.dir=../../src/java/src
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name="norm" default="help">
|
||||||
|
|
||||||
|
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||||
|
It contains the path to the SDK. It should *NOT* be checked into
|
||||||
|
Version Control Systems. -->
|
||||||
|
<property file="local.properties" />
|
||||||
|
|
||||||
|
<!-- The ant.properties file can be created by you. It is only edited by the
|
||||||
|
'android' tool to add properties to it.
|
||||||
|
This is the place to change some Ant specific build properties.
|
||||||
|
Here are some properties you may want to change/update:
|
||||||
|
|
||||||
|
source.dir
|
||||||
|
The name of the source directory. Default is 'src'.
|
||||||
|
out.dir
|
||||||
|
The name of the output directory. Default is 'bin'.
|
||||||
|
|
||||||
|
For other overridable properties, look at the beginning of the rules
|
||||||
|
files in the SDK, at tools/ant/build.xml
|
||||||
|
|
||||||
|
Properties related to the SDK location or the project target should
|
||||||
|
be updated using the 'android' tool with the 'update' action.
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<property file="ant.properties" />
|
||||||
|
|
||||||
|
<!-- The project.properties file is created and updated by the 'android'
|
||||||
|
tool, as well as ADT.
|
||||||
|
|
||||||
|
This contains project specific properties such as project target, and library
|
||||||
|
dependencies. Lower level build properties are stored in ant.properties
|
||||||
|
(or in .classpath for Eclipse projects).
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your
|
||||||
|
application and should be checked into Version Control Systems. -->
|
||||||
|
<loadproperties srcFile="project.properties" />
|
||||||
|
|
||||||
|
<!-- quick check on sdk.dir -->
|
||||||
|
<fail
|
||||||
|
message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var"
|
||||||
|
unless="sdk.dir"
|
||||||
|
/>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- extension targets. Uncomment the ones where you want to do custom work
|
||||||
|
in between standard targets -->
|
||||||
|
<!--
|
||||||
|
<target name="-pre-build">
|
||||||
|
</target>
|
||||||
|
<target name="-pre-compile">
|
||||||
|
</target>
|
||||||
|
|
||||||
|
/* This is typically used for code obfuscation.
|
||||||
|
Compiled code location: ${out.classes.absolute.dir}
|
||||||
|
If this is not done in place, override ${out.dex.input.absolute.dir} */
|
||||||
|
<target name="-post-compile">
|
||||||
|
</target>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Import the actual build file.
|
||||||
|
|
||||||
|
To customize existing targets, there are two options:
|
||||||
|
- Customize only one target:
|
||||||
|
- copy/paste the target into this file, *before* the
|
||||||
|
<import> task.
|
||||||
|
- customize it to your needs.
|
||||||
|
- Customize the whole content of build.xml
|
||||||
|
- copy/paste the content of the rules files (minus the top node)
|
||||||
|
into this file, replacing the <import> task.
|
||||||
|
- customize to your needs.
|
||||||
|
|
||||||
|
***********************
|
||||||
|
****** IMPORTANT ******
|
||||||
|
***********************
|
||||||
|
In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
|
||||||
|
in order to avoid having your file be overridden by tools such as "android update project"
|
||||||
|
-->
|
||||||
|
<!-- version-tag: 1 -->
|
||||||
|
<import file="${sdk.dir}/tools/ant/build.xml" />
|
||||||
|
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := norm
|
||||||
|
LOCAL_C_INCLUDES := \
|
||||||
|
$(LOCAL_PATH)/../../../protolib/include \
|
||||||
|
$(LOCAL_PATH)/../../../include
|
||||||
|
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES)
|
||||||
|
LOCAL_STATIC_LIBRARIES := protolib
|
||||||
|
|
||||||
|
ifeq ($(APP_OPTIM),debug)
|
||||||
|
LOCAL_CFLAGS += -DNORM_DEBUG
|
||||||
|
endif
|
||||||
|
LOCAL_EXPORT_CFLAGS := $(LOCAL_CFLAGS)
|
||||||
|
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
../../../src/common/galois.cpp \
|
||||||
|
../../../src/common/normApi.cpp \
|
||||||
|
../../../src/common/normEncoder.cpp \
|
||||||
|
../../../src/common/normEncoderMDP.cpp \
|
||||||
|
../../../src/common/normEncoderRS16.cpp \
|
||||||
|
../../../src/common/normEncoderRS8.cpp \
|
||||||
|
../../../src/common/normFile.cpp \
|
||||||
|
../../../src/common/normMessage.cpp \
|
||||||
|
../../../src/common/normNode.cpp \
|
||||||
|
../../../src/common/normObject.cpp \
|
||||||
|
../../../src/common/normSegment.cpp \
|
||||||
|
../../../src/common/normSession.cpp
|
||||||
|
include $(BUILD_STATIC_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := mil_navy_nrl_norm
|
||||||
|
LOCAL_STATIC_LIBRARIES := norm protolib
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
../../../src/java/jni/normDataJni.cpp \
|
||||||
|
../../../src/java/jni/normEventJni.cpp \
|
||||||
|
../../../src/java/jni/normFileJni.cpp \
|
||||||
|
../../../src/java/jni/normInstanceJni.cpp \
|
||||||
|
../../../src/java/jni/normJni.cpp \
|
||||||
|
../../../src/java/jni/normNodeJni.cpp \
|
||||||
|
../../../src/java/jni/normObjectJni.cpp \
|
||||||
|
../../../src/java/jni/normSessionJni.cpp \
|
||||||
|
../../../src/java/jni/normStreamJni.cpp
|
||||||
|
include $(BUILD_SHARED_LIBRARY)
|
||||||
|
|
||||||
|
include $(CLEAR_VARS)
|
||||||
|
LOCAL_MODULE := norm-app
|
||||||
|
LOCAL_STATIC_LIBRARIES := norm
|
||||||
|
LOCAL_SRC_FILES := \
|
||||||
|
../../../src/common/normApp.cpp \
|
||||||
|
../../../src/common/normPostProcess.cpp \
|
||||||
|
../../../src/unix/unixPostProcess.cpp
|
||||||
|
include $(BUILD_EXECUTABLE)
|
||||||
|
|
||||||
|
$(call import-module,protolib/makefiles/android/jni)
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
APP_ABI := all
|
||||||
|
APP_PLATFORM := android-9
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
# To enable ProGuard in your project, edit project.properties
|
||||||
|
# to define the proguard.config property as described in that file.
|
||||||
|
#
|
||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# By default, the flags in this file are appended to flags specified
|
||||||
|
# in ${sdk.dir}/tools/proguard/proguard-android.txt
|
||||||
|
# You can edit the include path and order by changing the ProGuard
|
||||||
|
# include property in project.properties.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system use,
|
||||||
|
# "ant.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
|
||||||
|
android.library=true
|
||||||
|
# Project target.
|
||||||
|
target=android-16
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
#########################################################################
|
||||||
|
# COMMON NORM-JNI MAKEFILE STUFF
|
||||||
|
#
|
||||||
|
|
||||||
|
.SUFFIXES: .cpp -sim.o $(.SUFFIXES)
|
||||||
|
|
||||||
|
NORMJNI = ../../src/java/jni
|
||||||
|
|
||||||
|
INCLUDES = $(SYSTEM_INCLUDES) -I../../include
|
||||||
|
|
||||||
|
CFLAGS = -g -O $(SYSTEM_CFLAGS) $(INCLUDES)
|
||||||
|
|
||||||
|
LIBNORM = ../../lib/libnorm.a
|
||||||
|
PROTOLIB = ../../protolib
|
||||||
|
LIBPROTO = $(PROTOLIB)/lib/libprotokit.a
|
||||||
|
|
||||||
|
LIBS = $(SYSTEM_LIBS) -lm -lpthread
|
||||||
|
|
||||||
|
# Rule for C++ .cpp extension
|
||||||
|
.cpp.o:
|
||||||
|
$(CC) -c $(CFLAGS) -o $*.o $*.cpp
|
||||||
|
|
||||||
|
LIB_SRC = \
|
||||||
|
$(NORMJNI)/normJni.cpp \
|
||||||
|
$(NORMJNI)/normInstanceJni.cpp \
|
||||||
|
$(NORMJNI)/normSessionJni.cpp \
|
||||||
|
$(NORMJNI)/normObjectJni.cpp \
|
||||||
|
$(NORMJNI)/normDataJni.cpp \
|
||||||
|
$(NORMJNI)/normFileJni.cpp \
|
||||||
|
$(NORMJNI)/normStreamJni.cpp \
|
||||||
|
$(NORMJNI)/normEventJni.cpp \
|
||||||
|
$(NORMJNI)/normNodeJni.cpp
|
||||||
|
|
||||||
|
LIB_OBJ = $(LIB_SRC:.cpp=.o)
|
||||||
|
LIB_DEP = $(LIB_SRC:.cpp=.d)
|
||||||
|
|
||||||
|
all: libmil_navy_nrl_norm.$(SYSTEM_SOEXT)
|
||||||
|
|
||||||
|
# NORM JNI shared library
|
||||||
|
libmil_navy_nrl_norm.$(SYSTEM_SOEXT): $(LIB_OBJ) $(LIBNORM) $(LIBPROTO)
|
||||||
|
$(CC) $(SYSTEM_SOFLAGS) $(LIB_OBJ) $(LIBNORM) $(LIBPROTO) $(LIBS) -o $@
|
||||||
|
mkdir -p ../../lib
|
||||||
|
cp $@ ../../lib/$@
|
||||||
|
|
||||||
|
$(LIBNORM):
|
||||||
|
$(MAKE) -C ../../makefiles -f Makefile.$(SYSTEM) libnorm.a
|
||||||
|
|
||||||
|
$(LIBPROTO):
|
||||||
|
$(MAKE) -C $(PROTOLIB)/makefiles -f Makefile.$(SYSTEM) libprotokit.a
|
||||||
|
|
||||||
|
-include $(LIB_DEP)
|
||||||
|
|
||||||
|
%.d: %.cpp
|
||||||
|
$(CC) -MM -MT $(@:.d=.o) -MF $@ $(CPPFLAGS) $<
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(NORMJNI)/*.o \
|
||||||
|
$(NORMJNI)/*.d \
|
||||||
|
libmil_navy_nrl_norm.$(SYSTEM_SOEXT) \
|
||||||
|
../../lib/libmil_navy_nrl_norm.$(SYSTEM_SOEXT)
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
|
||||||
|
# DO NOT DELETE THIS LINE -- mkdep uses it.
|
||||||
|
# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
#
|
||||||
|
# Linux NORM-JNI Makefile definitions
|
||||||
|
#
|
||||||
|
|
||||||
|
# System specific additional libraries, include paths, etc
|
||||||
|
SYSTEM_INCLUDES = -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux
|
||||||
|
SYSTEM_LIBS =
|
||||||
|
SYSTEM_SRC =
|
||||||
|
|
||||||
|
SYSTEM = linux
|
||||||
|
|
||||||
|
export CC = g++
|
||||||
|
export SYSTEM_CFLAGS = -fPIC -Wall -Wcast-align -D_FILE_OFFSET_BITS=64
|
||||||
|
export SYSTEM_SOFLAGS = -shared -Wl,--no-undefined
|
||||||
|
SYSTEM_SOEXT = so
|
||||||
|
|
||||||
|
include Makefile.common
|
||||||
|
|
@ -0,0 +1,62 @@
|
||||||
|
<project name="NORM" default="jar" basedir="../../src/java">
|
||||||
|
<!-- Properties -->
|
||||||
|
<property name="name" value="norm-1.0.0" />
|
||||||
|
<property name="optimize" value="false" />
|
||||||
|
<property name="debug" value="on" />
|
||||||
|
<property name="src.dir" value="src" />
|
||||||
|
<property name="class.dir" value="class" />
|
||||||
|
<property name="jni.dir" value="jni" />
|
||||||
|
<property name="dist.dir" value="../../lib" />
|
||||||
|
|
||||||
|
<!-- Compile Targets -->
|
||||||
|
<target name="compile" description="Compiles the project">
|
||||||
|
<mkdir dir="${class.dir}" />
|
||||||
|
<javac destdir="${class.dir}" debug="${debug}" optimize="${optimize}">
|
||||||
|
<src path="${src.dir}" />
|
||||||
|
<include name="mil/navy/nrl/norm/**/*.java" />
|
||||||
|
<compilerarg value="-Xlint:unchecked" />
|
||||||
|
</javac>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- JNI tasks -->
|
||||||
|
<target name="jni" depends="compile" description="Create the jni headers">
|
||||||
|
<javah outputFile="${jni.dir}/normInstanceJni.h" classpath="${class.dir}">
|
||||||
|
<class name="mil.navy.nrl.norm.NormInstance"/>
|
||||||
|
</javah>
|
||||||
|
<javah outputFile="${jni.dir}/normSessionJni.h" classpath="${class.dir}">
|
||||||
|
<class name="mil.navy.nrl.norm.NormSession"/>
|
||||||
|
</javah>
|
||||||
|
<javah outputFile="${jni.dir}/normObjectJni.h" classpath="${class.dir}">
|
||||||
|
<class name="mil.navy.nrl.norm.NormObject"/>
|
||||||
|
</javah>
|
||||||
|
<javah outputFile="${jni.dir}/normDataJni.h" classpath="${class.dir}">
|
||||||
|
<class name="mil.navy.nrl.norm.NormData"/>
|
||||||
|
</javah>
|
||||||
|
<javah outputFile="${jni.dir}/normFileJni.h" classpath="${class.dir}">
|
||||||
|
<class name="mil.navy.nrl.norm.NormFile"/>
|
||||||
|
</javah>
|
||||||
|
<javah outputFile="${jni.dir}/normStreamJni.h" classpath="${class.dir}">
|
||||||
|
<class name="mil.navy.nrl.norm.NormStream"/>
|
||||||
|
</javah>
|
||||||
|
<javah outputFile="${jni.dir}/normNodeJni.h" classpath="${class.dir}">
|
||||||
|
<class name="mil.navy.nrl.norm.NormNode"/>
|
||||||
|
</javah>
|
||||||
|
<javah outputFile="${jni.dir}/normEventJni.h" classpath="${class.dir}">
|
||||||
|
<class name="mil.navy.nrl.norm.NormEvent"/>
|
||||||
|
</javah>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Jar tasks -->
|
||||||
|
<target name="jar" depends="compile" description="Creates the jar file">
|
||||||
|
<mkdir dir="${dist.dir}" />
|
||||||
|
<jar jarfile="${dist.dir}/${name}.jar">
|
||||||
|
<fileset dir="${class.dir}" includes="mil/navy/nrl/norm/**/*.*" />
|
||||||
|
</jar>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Clean tasks -->
|
||||||
|
<target name="clean" description="Cleans the project">
|
||||||
|
<delete dir="${class.dir}" />
|
||||||
|
<delete file="${dist.dir}/${name}.jar" />
|
||||||
|
</target>
|
||||||
|
</project>
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 10.00
|
||||||
|
# Visual Studio 2008
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NormLib", "NormLib.vcproj", "{D7B0023C-8798-4918-8DA0-05C9054D70B9}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9} = {DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "norm", "norm\norm.vcproj", "{6E1308A6-D40F-489E-A4F1-40D859380D64}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{D7B0023C-8798-4918-8DA0-05C9054D70B9} = {D7B0023C-8798-4918-8DA0-05C9054D70B9}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "normTest", "normTest.vcproj", "{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9} = {DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9}
|
||||||
|
{182006F3-188F-466E-89FE-8421C0478691} = {182006F3-188F-466E-89FE-8421C0478691}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NormDll", "NormDll.vcproj", "{182006F3-188F-466E-89FE-8421C0478691}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9} = {DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "npc", "npc.vcproj", "{7BF4525B-9185-4296-A2BF-FFE77BB66EAF}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{D7B0023C-8798-4918-8DA0-05C9054D70B9} = {D7B0023C-8798-4918-8DA0-05C9054D70B9}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Protokit", "..\..\protolib\makefiles\win32\Protokit.vcproj", "{DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{D7B0023C-8798-4918-8DA0-05C9054D70B9}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{D7B0023C-8798-4918-8DA0-05C9054D70B9}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{D7B0023C-8798-4918-8DA0-05C9054D70B9}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{D7B0023C-8798-4918-8DA0-05C9054D70B9}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{6E1308A6-D40F-489E-A4F1-40D859380D64}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{6E1308A6-D40F-489E-A4F1-40D859380D64}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{6E1308A6-D40F-489E-A4F1-40D859380D64}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{6E1308A6-D40F-489E-A4F1-40D859380D64}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{182006F3-188F-466E-89FE-8421C0478691}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{182006F3-188F-466E-89FE-8421C0478691}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{182006F3-188F-466E-89FE-8421C0478691}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{182006F3-188F-466E-89FE-8421C0478691}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{7BF4525B-9185-4296-A2BF-FFE77BB66EAF}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{7BF4525B-9185-4296-A2BF-FFE77BB66EAF}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{DE94F096-A09B-44B6-8EFE-C7BF1F65C4C9}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,251 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9.00"
|
||||||
|
Name="NormDll"
|
||||||
|
ProjectGUID="{182006F3-188F-466E-89FE-8421C0478691}"
|
||||||
|
Keyword="Win32Proj"
|
||||||
|
TargetFrameworkVersion="131072"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="Debug"
|
||||||
|
IntermediateDirectory="Debug"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include;..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="NORM_USE_DLL;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
MinimalRebuild="true"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="ws2_32.lib iphlpapi.lib"
|
||||||
|
OutputFile="$(OutDir)/Norm.dll"
|
||||||
|
LinkIncremental="2"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile="$(OutDir)/NormDll.pdb"
|
||||||
|
SubSystem="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
ImportLibrary="$(OutDir)/Norm.lib"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="Release"
|
||||||
|
IntermediateDirectory="Release"
|
||||||
|
ConfigurationType="2"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalIncludeDirectories="..\..\include;..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="NORM_USE_DLL;NDEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="ws2_32.lib iphlpapi.lib"
|
||||||
|
OutputFile="$(OutDir)/Norm.dll"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
ImportLibrary="$(OutDir)/Norm.lib"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\galois.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normApi.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoder.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoderMDP.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoderRS16.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoderRS8.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normFile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normMessage.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normNode.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normObject.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normSegment.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normSession.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
||||||
|
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<File
|
||||||
|
RelativePath=".\ReadMe.txt"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
|
|
@ -0,0 +1,230 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9.00"
|
||||||
|
Name="NormLib"
|
||||||
|
ProjectGUID="{D7B0023C-8798-4918-8DA0-05C9054D70B9}"
|
||||||
|
TargetFrameworkVersion="131072"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory=".\Debug"
|
||||||
|
IntermediateDirectory=".\Debug"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include;..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Debug/NormLib.pch"
|
||||||
|
AssemblerListingLocation=".\Debug/"
|
||||||
|
ObjectFile=".\Debug/"
|
||||||
|
ProgramDataBaseFileName=".\Debug/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLibrarianTool"
|
||||||
|
OutputFile=".\Debug\NormLib.lib"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory=".\Release"
|
||||||
|
IntermediateDirectory=".\Release"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
AdditionalIncludeDirectories="..\..\include;..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="NDEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_LIB;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
StringPooling="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Release/NormLib.pch"
|
||||||
|
AssemblerListingLocation=".\Release/"
|
||||||
|
ObjectFile=".\Release/"
|
||||||
|
ProgramDataBaseFileName=".\Release/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLibrarianTool"
|
||||||
|
OutputFile=".\Release\NormLib.lib"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\galois.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normApi.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoder.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoderMDP.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoderRS16.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoderRS8.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normFile.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normMessage.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normNode.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normObject.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normSegment.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normSession.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
|
|
@ -0,0 +1,942 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9.00"
|
||||||
|
Name="NormLib"
|
||||||
|
ProjectGUID="{FDF1CD37-A1E7-435A-9C3D-61DA5A0E0E68}"
|
||||||
|
TargetFrameworkVersion="131072"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
<Platform
|
||||||
|
Name="Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory=".\Debug"
|
||||||
|
IntermediateDirectory=".\Debug"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include,..\..\..\protolib\include,..\protolib\win32,..\..\protolib\common,..\..\protolib\win32"
|
||||||
|
PreprocessorDefinitions="_DEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_LIB;UNICODE;_UNICODE;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Debug/NormLib.pch"
|
||||||
|
AssemblerListingLocation=".\Debug/"
|
||||||
|
ObjectFile=".\Debug/"
|
||||||
|
ProgramDataBaseFileName=".\Debug/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLibrarianTool"
|
||||||
|
OutputFile=".\Debug\NormLib.lib"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TargetEnvironment="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
ExecutionBucket="7"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include,..\..\..\protolib\include,..\protolib\win32,..\..\protolib\common,..\..\protolib\win32"
|
||||||
|
PreprocessorDefinitions="_DEBUG;PROTO_DEBUG;HAVE_ASSERT;WIN32;_LIB;UNICODE;_UNICODE;_CRT_SECURE_NO_WARNINGS;_ARM_;_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER)"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Debug/NormLib.pch"
|
||||||
|
AssemblerListingLocation=".\Debug/"
|
||||||
|
ObjectFile=".\Debug/"
|
||||||
|
ProgramDataBaseFileName=".\Debug/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLibrarianTool"
|
||||||
|
OutputFile=".\Debug\NormLib.lib"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCodeSignTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
<DeploymentTool
|
||||||
|
ForceDirty="-1"
|
||||||
|
RemoteDirectory=""
|
||||||
|
RegisterOutput="0"
|
||||||
|
AdditionalFiles=""
|
||||||
|
/>
|
||||||
|
<DebuggerTool
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory=".\Release"
|
||||||
|
IntermediateDirectory=".\Release"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
AdditionalIncludeDirectories="..\..\include,..\..\..\protolib\include,..\protolib\win32,..\..\protolib\common,..\..\protolib\win32"
|
||||||
|
PreprocessorDefinitions="NDEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_LIB;_CRT_SECURE_NO_DEPRECATE"
|
||||||
|
StringPooling="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Release/NormLib.pch"
|
||||||
|
AssemblerListingLocation=".\Release/"
|
||||||
|
ObjectFile=".\Release/"
|
||||||
|
ProgramDataBaseFileName=".\Release/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLibrarianTool"
|
||||||
|
OutputFile=".\Release\NormLib.lib"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
OutputDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"
|
||||||
|
IntermediateDirectory="Windows Mobile 6 Professional SDK (ARMV4I)\$(ConfigurationName)"
|
||||||
|
ConfigurationType="4"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TargetEnvironment="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
ExecutionBucket="7"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
AdditionalIncludeDirectories="..\..\include,..\..\..\protolib\include,..\protolib\win32,..\..\protolib\common,..\..\protolib\win32"
|
||||||
|
PreprocessorDefinitions="NDEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_LIB;_CRT_SECURE_NO_DEPRECATE"
|
||||||
|
StringPooling="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Release/NormLib.pch"
|
||||||
|
AssemblerListingLocation=".\Release/"
|
||||||
|
ObjectFile=".\Release/"
|
||||||
|
ProgramDataBaseFileName=".\Release/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLibrarianTool"
|
||||||
|
OutputFile=".\Release\NormLib.lib"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCodeSignTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
<DeploymentTool
|
||||||
|
ForceDirty="-1"
|
||||||
|
RemoteDirectory=""
|
||||||
|
RegisterOutput="0"
|
||||||
|
AdditionalFiles=""
|
||||||
|
/>
|
||||||
|
<DebuggerTool
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\galois.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normApi.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoder.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoderRS16.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoderRS8.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normEncoderMDP.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normFile.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normMessage.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normNode.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normObject.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normSegment.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normSession.cpp"
|
||||||
|
>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Debug|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Win32"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
<FileConfiguration
|
||||||
|
Name="Release|Windows Mobile 6 Professional SDK (ARMV4I)"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
AdditionalIncludeDirectories="..\..\include"
|
||||||
|
PreprocessorDefinitions=""
|
||||||
|
/>
|
||||||
|
</FileConfiguration>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
|
|
@ -0,0 +1,243 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9.00"
|
||||||
|
Name="norm"
|
||||||
|
ProjectGUID="{6E1308A6-D40F-489E-A4F1-40D859380D64}"
|
||||||
|
TargetFrameworkVersion="131072"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory=".\Debug"
|
||||||
|
IntermediateDirectory=".\Debug"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
MkTypLibCompatible="true"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
TargetEnvironment="1"
|
||||||
|
TypeLibraryName=".\Debug/norm.tlb"
|
||||||
|
HeaderFileName=""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\..\include;..\..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="_DEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_CRT_SECURE_NO_WARNINGS;_WINDOWS"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Debug/norm.pch"
|
||||||
|
AssemblerListingLocation=".\Debug/"
|
||||||
|
ObjectFile=".\Debug/"
|
||||||
|
ProgramDataBaseFileName=".\Debug/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
Detect64BitPortabilityProblems="true"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
|
||||||
|
OutputFile=".\Debug/norm.exe"
|
||||||
|
LinkIncremental="1"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile=".\Debug/norm.pdb"
|
||||||
|
SubSystem="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory=".\Release"
|
||||||
|
IntermediateDirectory=".\Release"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
MkTypLibCompatible="true"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
TargetEnvironment="1"
|
||||||
|
TypeLibraryName=".\Release/norm.tlb"
|
||||||
|
HeaderFileName=""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="/vmg"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
AdditionalIncludeDirectories="..\..\..\include;..\..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="NDEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_WINDOWS;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
StringPooling="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Release/norm.pch"
|
||||||
|
AssemblerListingLocation=".\Release/"
|
||||||
|
ObjectFile=".\Release/"
|
||||||
|
ProgramDataBaseFileName=".\Release/"
|
||||||
|
BrowseInformation="1"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
|
||||||
|
OutputFile=".\Release/norm.exe"
|
||||||
|
LinkIncremental="1"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
ProgramDatabaseFile=".\Release/norm.pdb"
|
||||||
|
SubSystem="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\..\src\common\normApp.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\..\src\common\normPostProcess.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\win32PostProcess.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
|
|
@ -0,0 +1,229 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9.00"
|
||||||
|
Name="normTest"
|
||||||
|
ProjectGUID="{32CF83E0-D2E0-4E43-8F7B-72BD0AB64647}"
|
||||||
|
RootNamespace="normTest"
|
||||||
|
TargetFrameworkVersion="131072"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory=".\Debug"
|
||||||
|
IntermediateDirectory=".\Debug"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TypeLibraryName=".\Debug/normTest.tlb"
|
||||||
|
HeaderFileName=""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include;..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="NORM_USE_DLL;PROTO_DEBUG;HAVE_ASSERT;WIN32;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
BufferSecurityCheck="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Debug/normTest.pch"
|
||||||
|
AssemblerListingLocation=".\Debug/"
|
||||||
|
ObjectFile=".\Debug/"
|
||||||
|
ProgramDataBaseFileName=".\Debug/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
|
||||||
|
OutputFile=".\Debug/normTest.exe"
|
||||||
|
LinkIncremental="0"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
AdditionalLibraryDirectories="./"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile=".\Debug/normTest.pdb"
|
||||||
|
SubSystem="1"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory=".\Release"
|
||||||
|
IntermediateDirectory=".\Release"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TypeLibraryName=".\Release/normTest.tlb"
|
||||||
|
HeaderFileName=""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
AdditionalIncludeDirectories="..\..\include;..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="NORM_USE_DLL;PROTO_DEBUG;WIN32;HAVE_ASSERT;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
StringPooling="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Release/normTest.pch"
|
||||||
|
AssemblerListingLocation=".\Release/"
|
||||||
|
ObjectFile=".\Release/"
|
||||||
|
ProgramDataBaseFileName=".\Release/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
IgnoreImportLibrary="false"
|
||||||
|
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
|
||||||
|
OutputFile=".\Release/normTest.exe"
|
||||||
|
LinkIncremental="1"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
AdditionalLibraryDirectories=""
|
||||||
|
ProgramDatabaseFile=".\Release/normTest.pdb"
|
||||||
|
SubSystem="1"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normTest.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
|
|
@ -0,0 +1,225 @@
|
||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="9.00"
|
||||||
|
Name="npc"
|
||||||
|
ProjectGUID="{7BF4525B-9185-4296-A2BF-FFE77BB66EAF}"
|
||||||
|
RootNamespace="normTest"
|
||||||
|
TargetFrameworkVersion="131072"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory=".\Debug"
|
||||||
|
IntermediateDirectory=".\Debug"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TypeLibraryName=".\Debug/normTest.tlb"
|
||||||
|
HeaderFileName=""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
AdditionalIncludeDirectories="..\..\include;..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="3"
|
||||||
|
BufferSecurityCheck="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Debug/normTest.pch"
|
||||||
|
AssemblerListingLocation=".\Debug/"
|
||||||
|
ObjectFile=".\Debug/"
|
||||||
|
ProgramDataBaseFileName=".\Debug/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
DebugInformationFormat="4"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="_DEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
|
||||||
|
LinkIncremental="0"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
AdditionalLibraryDirectories="./"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
SubSystem="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory=".\Release"
|
||||||
|
IntermediateDirectory=".\Release"
|
||||||
|
ConfigurationType="1"
|
||||||
|
InheritedPropertySheets="$(VCInstallDir)VCProjectDefaults\UpgradeFromVC71.vsprops"
|
||||||
|
UseOfMFC="0"
|
||||||
|
ATLMinimizesCRunTimeLibraryUsage="false"
|
||||||
|
CharacterSet="2"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
TypeLibraryName=".\Release/normTest.tlb"
|
||||||
|
HeaderFileName=""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="2"
|
||||||
|
InlineFunctionExpansion="1"
|
||||||
|
AdditionalIncludeDirectories="..\..\include;..\..\protolib\include"
|
||||||
|
PreprocessorDefinitions="NDEBUG;PROTO_DEBUG;HAVE_IPV6;HAVE_ASSERT;WIN32;_CRT_SECURE_NO_WARNINGS"
|
||||||
|
StringPooling="true"
|
||||||
|
RuntimeLibrary="2"
|
||||||
|
EnableFunctionLevelLinking="true"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
PrecompiledHeaderFile=".\Release/normTest.pch"
|
||||||
|
AssemblerListingLocation=".\Release/"
|
||||||
|
ObjectFile=".\Release/"
|
||||||
|
ProgramDataBaseFileName=".\Release/"
|
||||||
|
WarningLevel="3"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
DebugInformationFormat="3"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
PreprocessorDefinitions="NDEBUG"
|
||||||
|
Culture="1033"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
IgnoreImportLibrary="false"
|
||||||
|
AdditionalDependencies="iphlpapi.lib ws2_32.lib odbc32.lib odbccp32.lib"
|
||||||
|
LinkIncremental="1"
|
||||||
|
SuppressStartupBanner="true"
|
||||||
|
AdditionalLibraryDirectories=""
|
||||||
|
SubSystem="2"
|
||||||
|
RandomizedBaseAddress="1"
|
||||||
|
DataExecutionPrevention="0"
|
||||||
|
TargetMachine="1"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\src\common\normPrecode.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Resource Files"
|
||||||
|
Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
||||||
|
|
@ -1,432 +0,0 @@
|
||||||
# Copyright (c) 1994, 1995, 1996
|
|
||||||
# The Regents of the University of California. All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that: (1) source code distributions
|
|
||||||
# retain the above copyright notice and this paragraph in its entirety, (2)
|
|
||||||
# distributions including binary code include the above copyright notice and
|
|
||||||
# this paragraph in its entirety in the documentation or other materials
|
|
||||||
# provided with the distribution, and (3) all advertising materials mentioning
|
|
||||||
# features or use of this software display the following acknowledgement:
|
|
||||||
# ``This product includes software developed by the University of California,
|
|
||||||
# Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
|
||||||
# the University nor the names of its contributors may be used to endorse
|
|
||||||
# or promote products derived from this software without specific prior
|
|
||||||
# written permission.
|
|
||||||
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
||||||
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
||||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
#
|
|
||||||
# @(#) $Header: /cvsroot/norm/norm/ns/ns-2.1b7a-Makefile.in,v 1.1 2002/07/11 15:25:11 adamson Exp $ (LBL)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Various configurable paths (remember to edit Makefile.in, not Makefile)
|
|
||||||
#
|
|
||||||
|
|
||||||
# Top level hierarchy
|
|
||||||
prefix = @prefix@
|
|
||||||
# Pathname of directory to install the binary
|
|
||||||
BINDEST = @prefix@/bin
|
|
||||||
# Pathname of directory to install the man page
|
|
||||||
MANDEST = @prefix@/man
|
|
||||||
|
|
||||||
BLANK = # make a blank space. DO NOT add anything to this line
|
|
||||||
|
|
||||||
# The following will be redefined under Windows (see WIN32 lable below)
|
|
||||||
CC = @CC@
|
|
||||||
CPP = @CXX@
|
|
||||||
LINK = $(CPP)
|
|
||||||
MKDEP = ./conf/mkdep
|
|
||||||
TCLSH = @V_TCLSH@
|
|
||||||
TCL2C = @V_TCL2CPP@
|
|
||||||
AR = ar rc $(BLANK)
|
|
||||||
|
|
||||||
RANLIB = @V_RANLIB@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
LN = ln
|
|
||||||
TEST = test
|
|
||||||
RM = rm -f
|
|
||||||
PERL = @PERL@
|
|
||||||
|
|
||||||
|
|
||||||
CCOPT = @V_CCOPT@
|
|
||||||
STATIC = @V_STATIC@
|
|
||||||
LDFLAGS = $(STATIC)
|
|
||||||
LDOUT = -o $(BLANK)
|
|
||||||
|
|
||||||
DEFINE = -DTCP_DELAY_BIND_ALL -DNO_TK @V_DEFINE@ @V_DEFINES@ @DEFS@
|
|
||||||
|
|
||||||
PROTOLIB_INCLUDES = -Iprotolib/common -Iprotolib/ns
|
|
||||||
MDP_INCLUDES = -Imdp/common -Imdp/ns -Imdp/unix
|
|
||||||
NORM_INCLUDES = -Inorm/common -Inorm/ns
|
|
||||||
|
|
||||||
INCLUDES = \
|
|
||||||
-I. @V_INCLUDE_X11@ \
|
|
||||||
@V_INCLUDES@ \
|
|
||||||
$(PROTOLIB_INCLUDES) $(MDP_INCLUDES) $(NORM_INCLUDES)
|
|
||||||
|
|
||||||
LIB = \
|
|
||||||
@V_LIBS@ \
|
|
||||||
@V_LIB_X11@ \
|
|
||||||
@V_LIB@ \
|
|
||||||
-lm @LIBS@
|
|
||||||
# -L@libdir@ \
|
|
||||||
|
|
||||||
# These flags work on Linux
|
|
||||||
PROTOLIB_CFLAGS = -DUNIX -DNS2 -DPROTO_DEBUG -DSIMULATE -DHAVE_ASSERT -DHAVE_DIRFD
|
|
||||||
|
|
||||||
CFLAGS = $(CCOPT) $(DEFINE) -g $(PROTOLIB_CFLAGS)
|
|
||||||
|
|
||||||
# Explicitly define compilation rules since SunOS 4's make doesn't like gcc.
|
|
||||||
# Also, gcc does not remove the .o before forking 'as', which can be a
|
|
||||||
# problem if you don't own the file but can write to the directory.
|
|
||||||
# PROTOLIB/MDP/NORM code uses .cpp files so we added a suffix and rule
|
|
||||||
.SUFFIXES: .cc .cpp # $(.SUFFIXES)
|
|
||||||
|
|
||||||
.cpp.o:
|
|
||||||
@rm -f $@
|
|
||||||
$(CPP) -c $(CFLAGS) $(INCLUDES) -o $@ $*.cpp
|
|
||||||
|
|
||||||
.cc.o:
|
|
||||||
@rm -f $@
|
|
||||||
$(CPP) -c $(CFLAGS) $(INCLUDES) -o $@ $*.cc
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@rm -f $@
|
|
||||||
$(CC) -c $(CFLAGS) $(INCLUDES) -o $@ $*.c
|
|
||||||
|
|
||||||
|
|
||||||
GEN_DIR = gen/
|
|
||||||
LIB_DIR = lib/
|
|
||||||
NS = ns
|
|
||||||
NSX = nsx
|
|
||||||
NSE = nse
|
|
||||||
|
|
||||||
# To allow conf/makefile.win overwrite this macro
|
|
||||||
OBJ_STL = @V_STLOBJ@
|
|
||||||
|
|
||||||
# WIN32: uncomment the following line to include specific make for VC++
|
|
||||||
# !include <conf/makefile.win>
|
|
||||||
|
|
||||||
OBJ_CC = \
|
|
||||||
random.o rng.o ranvar.o misc.o timer-handler.o \
|
|
||||||
scheduler.o object.o \
|
|
||||||
packet.o ip.o route.o connector.o ttl.o \
|
|
||||||
trace.o trace-ip.o \
|
|
||||||
classifier.o classifier-addr.o classifier-hash.o classifier-virtual.o \
|
|
||||||
classifier-mcast.o classifier-bst.o classifier-mpath.o replicator.o \
|
|
||||||
classifier-mac.o classifier-port.o ump.o \
|
|
||||||
app.o telnet.o tcplib-telnet.o \
|
|
||||||
trafgen.o traffictrace.o pareto.o expoo.o cbr_traffic.o \
|
|
||||||
tbf.o resv.o sa.o saack.o \
|
|
||||||
measuremod.o estimator.o adc.o ms-adc.o timewindow-est.o acto-adc.o \
|
|
||||||
pointsample-est.o salink.o actp-adc.o hb-adc.o expavg-est.o\
|
|
||||||
param-adc.o null-estimator.o \
|
|
||||||
adaptive-receiver.o vatrcvr.o consrcvr.o \
|
|
||||||
agent.o message.o udp.o session-rtp.o rtp.o rtcp.o ivs.o \
|
|
||||||
tcp.o tcp-sink.o tcp-reno.o tcp-newreno.o \
|
|
||||||
tcp-vegas.o tcp-rbp.o tcp-full.o \
|
|
||||||
scoreboard.o tcp-sack1.o tcp-fack.o \
|
|
||||||
tcp-asym.o tcp-asym-sink.o tcp-fs.o tcp-asym-fs.o \
|
|
||||||
tcp-int.o chost.o tcp-session.o nilist.o \
|
|
||||||
integrator.o queue-monitor.o flowmon.o loss-monitor.o \
|
|
||||||
queue.o drop-tail.o simple-intserv-sched.o red.o \
|
|
||||||
semantic-packetqueue.o semantic-red.o ack-recons.o \
|
|
||||||
sfq.o fq.o drr.o cbq.o \
|
|
||||||
hackloss.o errmodel.o \
|
|
||||||
delay.o snoop.o \
|
|
||||||
dynalink.o rtProtoDV.o net-interface.o \
|
|
||||||
ctrMcast.o mcast_ctrl.o srm.o \
|
|
||||||
sessionhelper.o delaymodel.o srm-ssm.o \
|
|
||||||
srm-topo.o \
|
|
||||||
mftp.o mftp_snd.o mftp_rcv.o codeword.o \
|
|
||||||
alloc-address.o address.o \
|
|
||||||
$(LIB_DIR)int.Vec.o $(LIB_DIR)int.RVec.o \
|
|
||||||
$(LIB_DIR)dmalloc_support.o \
|
|
||||||
webcache/http.o webcache/tcp-simple.o webcache/pagepool.o \
|
|
||||||
webcache/inval-agent.o webcache/tcpapp.o webcache/http-aux.o \
|
|
||||||
webcache/mcache.o webcache/webtraf.o \
|
|
||||||
realaudio/realaudio.o \
|
|
||||||
lanRouter.o filter.o pkt-counter.o \
|
|
||||||
Decapsulator.o Encapsulator.o encap.o \
|
|
||||||
channel.o mac.o ll.o mac-802_11.o mac-802_3.o mac-tdma.o \
|
|
||||||
mip.o mip-reg.o gridkeeper.o \
|
|
||||||
propagation.o tworayground.o antenna.o omni-antenna.o \
|
|
||||||
shadowing.o bi-connector.o node.o mobilenode.o \
|
|
||||||
arp.o god.o dem.o topography.o modulation.o priqueue.o \
|
|
||||||
phy.o wired-phy.o wireless-phy.o \
|
|
||||||
mac-timers.o cmu-trace.o varp.o \
|
|
||||||
dsdv/dsdv.o dsdv/rtable.o rtqueue.o rttable.o \
|
|
||||||
imep/imep.o imep/dest_queue.o imep/imep_api.o \
|
|
||||||
imep/imep_rt.o imep/rxmit_queue.o imep/imep_timers.o \
|
|
||||||
imep/imep_util.o imep/imep_io.o \
|
|
||||||
tora/tora.o tora/tora_api.o tora/tora_dest.o tora/tora_io.o \
|
|
||||||
tora/tora_logs.o tora/tora_neighbor.o \
|
|
||||||
dsr/dsragent.o dsr/hdr_sr.o dsr/mobicache.o dsr/path.o \
|
|
||||||
dsr/requesttable.o dsr/routecache.o \
|
|
||||||
aodv/aodv_logs.o aodv/aodv.o \
|
|
||||||
ns-process.o \
|
|
||||||
satgeometry.o sathandoff.o satlink.o satnode.o \
|
|
||||||
satposition.o satroute.o sattrace.o \
|
|
||||||
rap/raplist.o rap/rap.o rap/media-app.o rap/utilities.o \
|
|
||||||
fsm.o tcp-abs.o \
|
|
||||||
diffusion/diffusion.o diffusion/diff_rate.o diffusion/diff_prob.o \
|
|
||||||
diffusion/diff_sink.o diffusion/flooding.o diffusion/omni_mcast.o \
|
|
||||||
diffusion/hash_table.o diffusion/routing_table.o diffusion/iflist.o \
|
|
||||||
tfrc.o tfrc-sink.o energy-model.o ping.o tcp-rfc793edu.o \
|
|
||||||
rio.o semantic-rio.o tcp-sack-rh.o scoreboard-rh.o \
|
|
||||||
plm/loss-monitor-plm.o plm/cbr-traffic-PP.o \
|
|
||||||
linkstate/hdr-ls.o \
|
|
||||||
mpls/classifier-addr-mpls.o mpls/ldp.o mpls/mpls-module.o \
|
|
||||||
rtmodule.o classifier-hier.o addr-params.o \
|
|
||||||
$(OBJ_STL)
|
|
||||||
|
|
||||||
# don't allow comments to follow continuation lines
|
|
||||||
|
|
||||||
# mac-csma.o mac-multihop.o\
|
|
||||||
# sensor-nets/landmark.o mac-simple-wireless.o \
|
|
||||||
# sensor-nets/tags.o sensor-nets/sensor-query.o \
|
|
||||||
# sensor-nets/flood-agent.o \
|
|
||||||
|
|
||||||
# what was here before is now in emulate/
|
|
||||||
OBJ_C =
|
|
||||||
|
|
||||||
OBJ_COMPAT = $(OBJ_GETOPT) win32.o
|
|
||||||
#XXX compat/win32x.o compat/tkConsole.o
|
|
||||||
|
|
||||||
OBJ_EMULATE_CC = \
|
|
||||||
emulate/net-ip.o \
|
|
||||||
emulate/net.o \
|
|
||||||
emulate/tap.o \
|
|
||||||
emulate/ether.o \
|
|
||||||
emulate/internet.o \
|
|
||||||
emulate/ping_responder.o \
|
|
||||||
emulate/arp.o \
|
|
||||||
emulate/icmp.o \
|
|
||||||
emulate/net-pcap.o \
|
|
||||||
emulate/nat.o
|
|
||||||
|
|
||||||
OBJ_EMULATE_C = \
|
|
||||||
emulate/inet.o
|
|
||||||
|
|
||||||
OBJ_PROTOLIB_CPP = \
|
|
||||||
protolib/ns/nsProtoAgent.o protolib/common/protoSim.o \
|
|
||||||
protolib/common/networkAddress.o protolib/common/protocolTimer.o \
|
|
||||||
protolib/common/debug.o
|
|
||||||
|
|
||||||
OBJ_MDP_CPP = \
|
|
||||||
mdp/ns/nsMdpAgent.o mdp/common/mdpSimAgent.o \
|
|
||||||
mdp/common/mdpBitMask.o mdp/common/mdpMessage.o \
|
|
||||||
mdp/common/mdpEncoder.o mdp/common/galois.o \
|
|
||||||
mdp/common/mdpSession.o mdp/common/mdpMsgHandler.o \
|
|
||||||
mdp/common/mdpNode.o mdp/common/mdpObject.o \
|
|
||||||
mdp/unix/mdpFile.o
|
|
||||||
|
|
||||||
OBJ_NORM_CPP = \
|
|
||||||
norm/ns/nsNormAgent.o norm/common/normSimAgent.o \
|
|
||||||
norm/common/normMessage.o norm/common/normSession.o \
|
|
||||||
norm/common/normNode.o norm/common/normObject.o \
|
|
||||||
norm/common/normSegment.o norm/common/normBitmask.o \
|
|
||||||
norm/common/normEncoder.o norm/common/galois.o \
|
|
||||||
norm/common/normFile.o
|
|
||||||
|
|
||||||
OBJ_GEN = $(GEN_DIR)version.o $(GEN_DIR)ns_tcl.o $(GEN_DIR)ptypes.o
|
|
||||||
|
|
||||||
SRC = $(OBJ_C:.o=.c) $(OBJ_CC:.o=.cc) \
|
|
||||||
$(OBJ_EMULATE_C:.o=.c) $(OBJ_EMULATE_CC:.o=.cc) \
|
|
||||||
tclAppInit.cc tkAppInit.cc \
|
|
||||||
$(OBJ_PROTOLIB_CPP:.o=.cpp) $(OBJ_MDP_CPP:.o=.cpp) \
|
|
||||||
$(OBJ_NORM_CPP:.o=.cpp)
|
|
||||||
|
|
||||||
OBJ = $(OBJ_C) $(OBJ_CC) $(OBJ_GEN) $(OBJ_COMPAT) \
|
|
||||||
$(OBJ_PROTOLIB_CPP) $(OBJ_MDP_CPP) $(OBJ_NORM_CPP)
|
|
||||||
|
|
||||||
CLEANFILES = ns nsx ns.dyn $(OBJ) $(OBJ_EMULATE_CC) \
|
|
||||||
$(OBJ_EMULATE_C) tclAppInit.o \
|
|
||||||
$(GEN_DIR)* $(NS).core core core.$(NS) core.$(NSX) core.$(NSE) \
|
|
||||||
ptypes2tcl ptypes2tcl.o
|
|
||||||
|
|
||||||
SUBDIRS=\
|
|
||||||
indep-utils/cmu-scen-gen/setdest \
|
|
||||||
indep-utils/webtrace-conv/dec \
|
|
||||||
indep-utils/webtrace-conv/epa \
|
|
||||||
indep-utils/webtrace-conv/nlanr \
|
|
||||||
indep-utils/webtrace-conv/ucb
|
|
||||||
|
|
||||||
all: $(NS) all-recursive
|
|
||||||
|
|
||||||
all-recursive:
|
|
||||||
for i in $(SUBDIRS); do ( cd $$i; $(MAKE) all; ) done
|
|
||||||
|
|
||||||
$(NS): $(OBJ) tclAppInit.o Makefile
|
|
||||||
$(LINK) $(LDFLAGS) $(LDOUT)$@ \
|
|
||||||
tclAppInit.o $(OBJ) $(LIB)
|
|
||||||
|
|
||||||
Makefile: Makefile.in
|
|
||||||
@echo "Makefile.in is newer than Makefile."
|
|
||||||
@echo "You need to re-run configure."
|
|
||||||
false
|
|
||||||
|
|
||||||
$(NSE): $(OBJ) tclAppInit.o $(OBJ_EMULATE_CC) $(OBJ_EMULATE_C)
|
|
||||||
$(LINK) $(LDFLAGS) $(LDOUT)$@ \
|
|
||||||
tclAppInit.o $(OBJ) \
|
|
||||||
$(OBJ_EMULATE_CC) $(OBJ_EMULATE_C) $(LIB) -lpcap
|
|
||||||
|
|
||||||
ns.dyn: $(OBJ) tclAppInit.o
|
|
||||||
$(LINK) $(LDFLAGS) -o $@ \
|
|
||||||
tclAppInit.o $(OBJ) $(LIB)
|
|
||||||
|
|
||||||
PURIFY = purify -cache-dir=/tmp
|
|
||||||
ns-pure: $(OBJ) tclAppInit.o
|
|
||||||
$(PURIFY) $(LINK) $(LDFLAGS) -o $@ \
|
|
||||||
tclAppInit.o $(OBJ) $(LIB)
|
|
||||||
|
|
||||||
NS_TCL_LIB = \
|
|
||||||
tcl/lib/ns-compat.tcl \
|
|
||||||
tcl/lib/ns-default.tcl \
|
|
||||||
tcl/lib/ns-errmodel.tcl \
|
|
||||||
tcl/lib/ns-lib.tcl \
|
|
||||||
tcl/lib/ns-link.tcl \
|
|
||||||
tcl/lib/ns-mobilenode.tcl \
|
|
||||||
tcl/lib/ns-sat.tcl \
|
|
||||||
tcl/lib/ns-cmutrace.tcl \
|
|
||||||
tcl/lib/ns-node.tcl \
|
|
||||||
tcl/lib/ns-rtmodule.tcl \
|
|
||||||
tcl/lib/ns-hiernode.tcl \
|
|
||||||
tcl/lib/ns-packet.tcl \
|
|
||||||
tcl/lib/ns-queue.tcl \
|
|
||||||
tcl/lib/ns-source.tcl \
|
|
||||||
tcl/lib/ns-nam.tcl \
|
|
||||||
tcl/lib/ns-trace.tcl \
|
|
||||||
tcl/lib/ns-agent.tcl \
|
|
||||||
tcl/lib/ns-random.tcl \
|
|
||||||
tcl/lib/ns-namsupp.tcl \
|
|
||||||
tcl/lib/ns-address.tcl \
|
|
||||||
tcl/lib/ns-intserv.tcl \
|
|
||||||
tcl/lib/ns-autoconf.tcl \
|
|
||||||
tcl/rtp/session-rtp.tcl \
|
|
||||||
tcl/lib/ns-mip.tcl \
|
|
||||||
tcl/rtglib/dynamics.tcl \
|
|
||||||
tcl/rtglib/route-proto.tcl \
|
|
||||||
tcl/rtglib/algo-route-proto.tcl \
|
|
||||||
tcl/rtglib/ns-rtProtoLS.tcl \
|
|
||||||
tcl/interface/ns-iface.tcl \
|
|
||||||
tcl/mcast/BST.tcl \
|
|
||||||
tcl/mcast/ns-mcast.tcl \
|
|
||||||
tcl/mcast/McastProto.tcl \
|
|
||||||
tcl/mcast/DM.tcl \
|
|
||||||
tcl/mcast/srm.tcl \
|
|
||||||
tcl/mcast/srm-adaptive.tcl \
|
|
||||||
tcl/mcast/srm-ssm.tcl \
|
|
||||||
tcl/mcast/timer.tcl \
|
|
||||||
tcl/mcast/McastMonitor.tcl \
|
|
||||||
tcl/mcast/mftp_snd.tcl \
|
|
||||||
tcl/mcast/mftp_rcv.tcl \
|
|
||||||
tcl/mcast/mftp_rcv_stat.tcl \
|
|
||||||
tcl/mobility/dsdv.tcl \
|
|
||||||
tcl/mobility/dsr.tcl \
|
|
||||||
tcl/ctr-mcast/CtrMcast.tcl \
|
|
||||||
tcl/ctr-mcast/CtrMcastComp.tcl \
|
|
||||||
tcl/ctr-mcast/CtrRPComp.tcl \
|
|
||||||
tcl/rlm/rlm.tcl \
|
|
||||||
tcl/rlm/rlm-ns.tcl \
|
|
||||||
tcl/session/session.tcl \
|
|
||||||
tcl/lib/ns-route.tcl \
|
|
||||||
tcl/emulate/ns-emulate.tcl \
|
|
||||||
tcl/lan/vlan.tcl \
|
|
||||||
tcl/lan/ns-ll.tcl \
|
|
||||||
tcl/lan/ns-mac.tcl \
|
|
||||||
tcl/webcache/http-agent.tcl \
|
|
||||||
tcl/webcache/http-server.tcl \
|
|
||||||
tcl/webcache/http-cache.tcl \
|
|
||||||
tcl/webcache/http-mcache.tcl \
|
|
||||||
tcl/webcache/webtraf.tcl \
|
|
||||||
tcl/plm/plm.tcl \
|
|
||||||
tcl/plm/plm-ns.tcl \
|
|
||||||
tcl/plm/plm-topo.tcl \
|
|
||||||
tcl/mpls/ns-mpls-classifier.tcl \
|
|
||||||
tcl/mpls/ns-mpls-ldpagent.tcl \
|
|
||||||
tcl/mpls/ns-mpls-node.tcl \
|
|
||||||
tcl/mpls/ns-mpls-simulator.tcl
|
|
||||||
|
|
||||||
$(GEN_DIR)ns_tcl.cc: $(NS_TCL_LIB)
|
|
||||||
$(TCLSH) bin/tcl-expand.tcl tcl/lib/ns-lib.tcl tcl/lib/ns-stl.tcl | $(TCL2C) et_ns_lib > $@
|
|
||||||
|
|
||||||
$(GEN_DIR)version.c: VERSION
|
|
||||||
$(RM) $@
|
|
||||||
$(TCLSH) bin/string2c.tcl version_string < VERSION > $@
|
|
||||||
|
|
||||||
$(GEN_DIR)ptypes.cc: ptypes2tcl packet.h
|
|
||||||
./ptypes2tcl > $@
|
|
||||||
|
|
||||||
ptypes2tcl: ptypes2tcl.o
|
|
||||||
$(LINK) $(LDFLAGS) $(LDOUT)$@ ptypes2tcl.o
|
|
||||||
|
|
||||||
ptypes2tcl.o: ptypes2tcl.cc packet.h
|
|
||||||
|
|
||||||
install: force install-ns install-man install-recursive
|
|
||||||
|
|
||||||
install-ns: force
|
|
||||||
$(INSTALL) -m 555 -o bin -g bin ns $(DESTDIR)$(BINDEST)
|
|
||||||
|
|
||||||
install-man: force
|
|
||||||
$(INSTALL) -m 444 -o bin -g bin ns.1 $(DESTDIR)$(MANDEST)/man1
|
|
||||||
|
|
||||||
install-recursive: force
|
|
||||||
for i in $(SUBDIRS); do cd $$i; $(MAKE) install; done
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(CLEANFILES)
|
|
||||||
|
|
||||||
AUTOCONF_GEN = tcl/lib/ns-autoconf.tcl tcl/lib/ns-stl.tcl
|
|
||||||
distclean:
|
|
||||||
$(RM) $(CLEANFILES) Makefile config.cache config.log config.status \
|
|
||||||
gnuc.h os-proto.h $(AUTOCONF_GEN)
|
|
||||||
|
|
||||||
tags: force
|
|
||||||
ctags -wtd *.cc *.h webcache/*.cc webcache/*.h dsdv/*.cc dsdv/*.h \
|
|
||||||
dsr/*.cc dsr/*.h webcache/*.cc webcache/*.h lib/*.cc lib/*.h \
|
|
||||||
../Tcl/*.cc ../Tcl/*.h
|
|
||||||
|
|
||||||
TAGS: force
|
|
||||||
etags *.cc *.h webcache/*.cc webcache/*.h dsdv/*.cc dsdv/*.h \
|
|
||||||
dsr/*.cc dsr/*.h webcache/*.cc webcache/*.h lib/*.cc lib/*.h \
|
|
||||||
../Tcl/*.cc ../Tcl/*.h
|
|
||||||
|
|
||||||
tcl/lib/TAGS: force
|
|
||||||
( \
|
|
||||||
cd tcl/lib; \
|
|
||||||
$(TCLSH) ../../bin/tcl-expand.tcl ns-lib.tcl | grep '^### tcl-expand.tcl: begin' | awk '{print $$5}' >.tcl_files; \
|
|
||||||
etags --lang=none -r '/^[ \t]*proc[ \t]+\([^ \t]+\)/\1/' `cat .tcl_files`; \
|
|
||||||
etags --append --lang=none -r '/^\([A-Z][^ \t]+\)[ \t]+\(instproc\|proc\)[ \t]+\([^ \t]+\)[ \t]+/\1::\3/' `cat .tcl_files`; \
|
|
||||||
)
|
|
||||||
|
|
||||||
depend: $(SRC)
|
|
||||||
$(MKDEP) $(CFLAGS) $(INCLUDES) $(SRC)
|
|
||||||
|
|
||||||
srctar:
|
|
||||||
@cwd=`pwd` ; dir=`basename $$cwd` ; \
|
|
||||||
name=ns-`cat VERSION | tr A-Z a-z` ; \
|
|
||||||
tar=ns-src-`cat VERSION`.tar.gz ; \
|
|
||||||
list="" ; \
|
|
||||||
for i in `cat FILES` ; do list="$$list $$name/$$i" ; done; \
|
|
||||||
echo \
|
|
||||||
"(rm -f $$tar; cd .. ; ln -s $$dir $$name)" ; \
|
|
||||||
(rm -f $$tar; cd .. ; ln -s $$dir $$name) ; \
|
|
||||||
echo \
|
|
||||||
"(cd .. ; tar cfh $$tar [lots of files])" ; \
|
|
||||||
(cd .. ; tar cfh - $$list) | gzip -c > $$tar ; \
|
|
||||||
echo \
|
|
||||||
"rm ../$$name; chmod 444 $$tar" ; \
|
|
||||||
rm ../$$name; chmod 444 $$tar
|
|
||||||
|
|
||||||
force:
|
|
||||||
|
|
||||||
test: force
|
|
||||||
./validate
|
|
||||||
|
|
||||||
# Create makefile.vc for Win32 development by replacing:
|
|
||||||
# "# !include ..." -> "!include ..."
|
|
||||||
makefile.vc: Makefile.in
|
|
||||||
$(PERL) bin/gen-vcmake.pl < Makefile.in > makefile.vc
|
|
||||||
# $(PERL) -pe 's/^# (\!include)/\!include/o' < Makefile.in > makefile.vc
|
|
||||||
|
|
@ -1,536 +0,0 @@
|
||||||
# Copyright (c) 1994, 1995, 1996
|
|
||||||
# The Regents of the University of California. All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that: (1) source code distributions
|
|
||||||
# retain the above copyright notice and this paragraph in its entirety, (2)
|
|
||||||
# distributions including binary code include the above copyright notice and
|
|
||||||
# this paragraph in its entirety in the documentation or other materials
|
|
||||||
# provided with the distribution, and (3) all advertising materials mentioning
|
|
||||||
# features or use of this software display the following acknowledgement:
|
|
||||||
# ``This product includes software developed by the University of California,
|
|
||||||
# Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
|
||||||
# the University nor the names of its contributors may be used to endorse
|
|
||||||
# or promote products derived from this software without specific prior
|
|
||||||
# written permission.
|
|
||||||
# THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
|
||||||
# WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
|
||||||
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
#
|
|
||||||
# @(#) $Header: /cvsroot/norm/norm/ns/ns-2.1b9-Makefile.in,v 1.1 2002/11/18 16:14:07 adamson Exp $ (LBL)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Various configurable paths (remember to edit Makefile.in, not Makefile)
|
|
||||||
#
|
|
||||||
|
|
||||||
# Top level hierarchy
|
|
||||||
prefix = @prefix@
|
|
||||||
# Pathname of directory to install the binary
|
|
||||||
BINDEST = @prefix@/bin
|
|
||||||
# Pathname of directory to install the man page
|
|
||||||
MANDEST = @prefix@/man
|
|
||||||
|
|
||||||
BLANK = # make a blank space. DO NOT add anything to this line
|
|
||||||
|
|
||||||
# The following will be redefined under Windows (see WIN32 lable below)
|
|
||||||
CC = @CC@
|
|
||||||
CPP = @CXX@
|
|
||||||
LINK = $(CPP)
|
|
||||||
MKDEP = ./conf/mkdep
|
|
||||||
TCLSH = @V_TCLSH@
|
|
||||||
TCL2C = @V_TCL2CPP@
|
|
||||||
AR = ar rc $(BLANK)
|
|
||||||
|
|
||||||
RANLIB = @V_RANLIB@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
LN = ln
|
|
||||||
TEST = test
|
|
||||||
RM = rm -f
|
|
||||||
MV = mv
|
|
||||||
PERL = @PERL@
|
|
||||||
|
|
||||||
# for diffusion
|
|
||||||
#DIFF_INCLUDES = "./diffusion3/main ./diffusion3/lib ./diffusion3/nr ./diffusion3/ns"
|
|
||||||
|
|
||||||
CCOPT = @V_CCOPT@
|
|
||||||
STATIC = @V_STATIC@
|
|
||||||
LDFLAGS = $(STATIC)
|
|
||||||
LDOUT = -o $(BLANK)
|
|
||||||
|
|
||||||
DEFINE = -DTCP_DELAY_BIND_ALL -DNO_TK -DNIXVECTOR @V_DEFINE@ @V_DEFINES@ @DEFS@ -DPGM -DPGM_DEBUG -DNS_DIFFUSION
|
|
||||||
|
|
||||||
|
|
||||||
PROTOLIB_INCLUDES = -Iprotolib/common -Iprotolib/ns
|
|
||||||
MDP_INCLUDES = -Imdp/common -Imdp/ns -Imdp/unix
|
|
||||||
NORM_INCLUDES = -Inorm/common -Inorm/ns
|
|
||||||
|
|
||||||
INCLUDES = \
|
|
||||||
-I. @V_INCLUDE_X11@ \
|
|
||||||
@V_INCLUDES@ \
|
|
||||||
-I./tcp -I./common -I./link -I./queue \
|
|
||||||
-I./adc -I./apps -I./mac -I./mobile -I./trace \
|
|
||||||
-I./routing -I./tools -I./classifier -I./mcast \
|
|
||||||
-I./diffusion3/main -I./diffusion3/lib \
|
|
||||||
-I./diffusion3/nr -I./diffusion3/ns -I./asim/ \
|
|
||||||
$(PROTOLIB_INCLUDES) $(MDP_INCLUDES) $(NORM_INCLUDES)
|
|
||||||
|
|
||||||
|
|
||||||
LIB = \
|
|
||||||
@V_LIBS@ \
|
|
||||||
@V_LIB_X11@ \
|
|
||||||
@V_LIB@ \
|
|
||||||
-lm @LIBS@
|
|
||||||
# -L@libdir@ \
|
|
||||||
|
|
||||||
# These flags work on Linux
|
|
||||||
PROTOLIB_CFLAGS = -g -DUNIX -DNS2 -DPROTO_DEBUG -DSIMULATE -DHAVE_ASSERT -DHAVE_DIRFD
|
|
||||||
|
|
||||||
CFLAGS = $(CCOPT) $(DEFINE) $(PROTOLIB_CFLAGS)
|
|
||||||
|
|
||||||
# Explicitly define compilation rules since SunOS 4's make doesn't like gcc.
|
|
||||||
# Also, gcc does not remove the .o before forking 'as', which can be a
|
|
||||||
# problem if you don't own the file but can write to the directory.
|
|
||||||
# PROTOLIB/MDP/NORM code uses .cpp files so we added a suffix and rule
|
|
||||||
.SUFFIXES: .cc .cpp # $(.SUFFIXES)
|
|
||||||
|
|
||||||
.cc.o:
|
|
||||||
@rm -f $@
|
|
||||||
$(CPP) -c $(CFLAGS) $(INCLUDES) -o $@ $*.cc
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@rm -f $@
|
|
||||||
$(CC) -c $(CFLAGS) $(INCLUDES) -o $@ $*.c
|
|
||||||
|
|
||||||
.cpp.o:
|
|
||||||
@rm -f $@
|
|
||||||
$(CC) -c $(CFLAGS) $(INCLUDES) -o $@ $*.cpp
|
|
||||||
|
|
||||||
|
|
||||||
GEN_DIR = gen/
|
|
||||||
LIB_DIR = lib/
|
|
||||||
NS = ns
|
|
||||||
NSX = nsx
|
|
||||||
NSE = nse
|
|
||||||
|
|
||||||
# To allow conf/makefile.win overwrite this macro
|
|
||||||
# We will set these two macros to empty in conf/makefile.win since VC6.0
|
|
||||||
# does not seem to support the STL in gcc 2.8 and up.
|
|
||||||
OBJ_STL = linkstate/ls.o linkstate/rtProtoLS.o \
|
|
||||||
pgm/classifier-pgm.o pgm/pgm-agent.o pgm/pgm-sender.o \
|
|
||||||
pgm/pgm-receiver.o pgm/rcvbuf.o \
|
|
||||||
diffusion3/nr/nr.o diffusion3/lib/dr.o \
|
|
||||||
diffusion3/ns/diffagent.o diffusion3/ns/diffrtg.o \
|
|
||||||
diffusion3/ns/difftimer.o diffusion3/main/diffusion.o \
|
|
||||||
diffusion3/main/attrs.o diffusion3/main/iodev.o \
|
|
||||||
diffusion3/main/events.o diffusion3/main/message.o \
|
|
||||||
diffusion3/main/hashutils.o diffusion3/main/stats.o \
|
|
||||||
diffusion3/main/tools.o diffusion3/main/drivers/rpc_stats.o \
|
|
||||||
diffusion3/apps/sysapps/gradient.o \
|
|
||||||
diffusion3/apps/sysapps/log.o \
|
|
||||||
diffusion3/lib/diffapp.o \
|
|
||||||
diffusion3/apps/agents/ping_sender.o \
|
|
||||||
diffusion3/apps/agents/ping_receiver.o \
|
|
||||||
diffusion3/apps/agents/ping_common.o \
|
|
||||||
diffusion3/apps/gear/geo-attr.o \
|
|
||||||
diffusion3/apps/gear/geo-routing.o \
|
|
||||||
diffusion3/apps/gear/geo-tools.o
|
|
||||||
|
|
||||||
NS_TCL_LIB_STL = tcl/rtglib/ns-rtProtoLS.tcl \
|
|
||||||
tcl/lib/ns-diffusion.tcl
|
|
||||||
|
|
||||||
# WIN32: uncomment the following line to include specific make for VC++
|
|
||||||
# !include <conf/makefile.win>
|
|
||||||
|
|
||||||
OBJ_CC = \
|
|
||||||
tools/random.o tools/rng.o tools/ranvar.o common/misc.o common/timer-handler.o \
|
|
||||||
common/scheduler.o common/object.o common/packet.o \
|
|
||||||
common/ip.o routing/route.o common/connector.o common/ttl.o \
|
|
||||||
trace/trace.o trace/trace-ip.o \
|
|
||||||
classifier/classifier.o classifier/classifier-addr.o \
|
|
||||||
classifier/classifier-hash.o \
|
|
||||||
classifier/classifier-virtual.o \
|
|
||||||
classifier/classifier-mcast.o \
|
|
||||||
classifier/classifier-bst.o \
|
|
||||||
classifier/classifier-mpath.o mcast/replicator.o \
|
|
||||||
classifier/classifier-mac.o \
|
|
||||||
classifier/classifier-port.o src_rtg/classifier-sr.o \
|
|
||||||
src_rtg/sragent.o src_rtg/hdr_src.o adc/ump.o \
|
|
||||||
apps/app.o apps/telnet.o tcp/tcplib-telnet.o \
|
|
||||||
tools/trafgen.o trace/traffictrace.o tools/pareto.o \
|
|
||||||
tools/expoo.o tools/cbr_traffic.o \
|
|
||||||
adc/tbf.o adc/resv.o adc/sa.o tcp/saack.o \
|
|
||||||
tools/measuremod.o adc/estimator.o adc/adc.o adc/ms-adc.o \
|
|
||||||
adc/timewindow-est.o adc/acto-adc.o \
|
|
||||||
adc/pointsample-est.o adc/salink.o adc/actp-adc.o \
|
|
||||||
adc/hb-adc.o adc/expavg-est.o\
|
|
||||||
adc/param-adc.o adc/null-estimator.o \
|
|
||||||
adc/adaptive-receiver.o apps/vatrcvr.o adc/consrcvr.o \
|
|
||||||
common/agent.o common/message.o apps/udp.o \
|
|
||||||
common/session-rtp.o apps/rtp.o tcp/rtcp.o \
|
|
||||||
common/ivs.o \
|
|
||||||
tcp/tcp.o tcp/tcp-sink.o tcp/tcp-reno.o \
|
|
||||||
tcp/tcp-newreno.o \
|
|
||||||
tcp/tcp-vegas.o tcp/tcp-rbp.o tcp/tcp-full.o tcp/rq.o \
|
|
||||||
baytcp/tcp-full-bay.o baytcp/ftpc.o baytcp/ftps.o \
|
|
||||||
tcp/scoreboard.o tcp/tcp-sack1.o tcp/tcp-fack.o \
|
|
||||||
tcp/tcp-asym.o tcp/tcp-asym-sink.o tcp/tcp-fs.o \
|
|
||||||
tcp/tcp-asym-fs.o \
|
|
||||||
tcp/tcp-int.o tcp/chost.o tcp/tcp-session.o \
|
|
||||||
tcp/nilist.o \
|
|
||||||
tools/integrator.o tools/queue-monitor.o \
|
|
||||||
tools/flowmon.o tools/loss-monitor.o \
|
|
||||||
queue/queue.o queue/drop-tail.o \
|
|
||||||
adc/simple-intserv-sched.o queue/red.o \
|
|
||||||
queue/semantic-packetqueue.o queue/semantic-red.o \
|
|
||||||
tcp/ack-recons.o \
|
|
||||||
queue/sfq.o queue/fq.o queue/drr.o queue/srr.o queue/cbq.o \
|
|
||||||
link/hackloss.o queue/errmodel.o queue/fec.o\
|
|
||||||
link/delay.o tcp/snoop.o \
|
|
||||||
gaf/gaf.o \
|
|
||||||
link/dynalink.o routing/rtProtoDV.o common/net-interface.o \
|
|
||||||
mcast/ctrMcast.o mcast/mcast_ctrl.o mcast/srm.o \
|
|
||||||
common/sessionhelper.o queue/delaymodel.o \
|
|
||||||
mcast/srm-ssm.o mcast/srm-topo.o \
|
|
||||||
apps/mftp.o apps/mftp_snd.o apps/mftp_rcv.o \
|
|
||||||
apps/codeword.o \
|
|
||||||
routing/alloc-address.o routing/address.o \
|
|
||||||
$(LIB_DIR)int.Vec.o $(LIB_DIR)int.RVec.o \
|
|
||||||
$(LIB_DIR)dmalloc_support.o \
|
|
||||||
webcache/http.o webcache/tcp-simple.o webcache/pagepool.o \
|
|
||||||
webcache/inval-agent.o webcache/tcpapp.o webcache/http-aux.o \
|
|
||||||
webcache/mcache.o webcache/webtraf.o \
|
|
||||||
empweb/empweb.o \
|
|
||||||
empweb/empftp.o \
|
|
||||||
realaudio/realaudio.o \
|
|
||||||
mac/lanRouter.o classifier/filter.o \
|
|
||||||
common/pkt-counter.o \
|
|
||||||
common/Decapsulator.o common/Encapsulator.o \
|
|
||||||
common/encap.o \
|
|
||||||
mac/channel.o mac/mac.o mac/ll.o mac/mac-802_11.o \
|
|
||||||
mac/mac-802_3.o mac/mac-tdma.o \
|
|
||||||
mobile/mip.o mobile/mip-reg.o mobile/gridkeeper.o \
|
|
||||||
mobile/propagation.o mobile/tworayground.o \
|
|
||||||
mobile/antenna.o mobile/omni-antenna.o \
|
|
||||||
mobile/shadowing.o mobile/shadowing-vis.o \
|
|
||||||
common/bi-connector.o common/node.o \
|
|
||||||
common/mobilenode.o \
|
|
||||||
mac/arp.o mobile/god.o mobile/dem.o \
|
|
||||||
mobile/topography.o mobile/modulation.o \
|
|
||||||
queue/priqueue.o \
|
|
||||||
mac/phy.o mac/wired-phy.o mac/wireless-phy.o \
|
|
||||||
mac/mac-timers.o trace/cmu-trace.o mac/varp.o \
|
|
||||||
dsdv/dsdv.o dsdv/rtable.o queue/rtqueue.o \
|
|
||||||
routing/rttable.o \
|
|
||||||
imep/imep.o imep/dest_queue.o imep/imep_api.o \
|
|
||||||
imep/imep_rt.o imep/rxmit_queue.o imep/imep_timers.o \
|
|
||||||
imep/imep_util.o imep/imep_io.o \
|
|
||||||
tora/tora.o tora/tora_api.o tora/tora_dest.o \
|
|
||||||
tora/tora_io.o tora/tora_logs.o tora/tora_neighbor.o \
|
|
||||||
dsr/dsragent.o dsr/hdr_sr.o dsr/mobicache.o dsr/path.o \
|
|
||||||
dsr/requesttable.o dsr/routecache.o dsr/add_sr.o \
|
|
||||||
dsr/dsr_proto.o dsr/flowstruct.o dsr/linkcache.o \
|
|
||||||
dsr/simplecache.o dsr/sr_forwarder.o \
|
|
||||||
aodv/aodv_logs.o aodv/aodv.o \
|
|
||||||
aodv/aodv_rtable.o aodv/aodv_rqueue.o \
|
|
||||||
common/ns-process.o \
|
|
||||||
satellite/satgeometry.o satellite/sathandoff.o \
|
|
||||||
satellite/satlink.o satellite/satnode.o \
|
|
||||||
satellite/satposition.o satellite/satroute.o \
|
|
||||||
satellite/sattrace.o \
|
|
||||||
rap/raplist.o rap/rap.o rap/media-app.o rap/utilities.o \
|
|
||||||
common/fsm.o tcp/tcp-abs.o \
|
|
||||||
diffusion/diffusion.o diffusion/diff_rate.o diffusion/diff_prob.o \
|
|
||||||
diffusion/diff_sink.o diffusion/flooding.o diffusion/omni_mcast.o \
|
|
||||||
diffusion/hash_table.o diffusion/routing_table.o diffusion/iflist.o \
|
|
||||||
tcp/tfrc.o tcp/tfrc-sink.o mobile/energy-model.o apps/ping.o tcp/tcp-rfc793edu.o \
|
|
||||||
queue/rio.o queue/semantic-rio.o tcp/tcp-sack-rh.o tcp/scoreboard-rh.o \
|
|
||||||
plm/loss-monitor-plm.o plm/cbr-traffic-PP.o \
|
|
||||||
linkstate/hdr-ls.o \
|
|
||||||
mpls/classifier-addr-mpls.o mpls/ldp.o mpls/mpls-module.o \
|
|
||||||
routing/rtmodule.o classifier/classifier-hier.o \
|
|
||||||
routing/addr-params.o \
|
|
||||||
nix/hdr_nv.o nix/classifier-nix.o \
|
|
||||||
nix/nixnode.o \
|
|
||||||
routealgo/rnode.o \
|
|
||||||
routealgo/bfs.o \
|
|
||||||
routealgo/rbitmap.o \
|
|
||||||
routealgo/rlookup.o \
|
|
||||||
routealgo/routealgo.o \
|
|
||||||
nix/nixvec.o \
|
|
||||||
nix/nixroute.o \
|
|
||||||
diffserv/dsred.o diffserv/dsredq.o \
|
|
||||||
diffserv/dsEdge.o diffserv/dsCore.o \
|
|
||||||
diffserv/dsPolicy.o diffserv/ew.o\
|
|
||||||
queue/red-pd.o queue/pi.o queue/vq.o queue/rem.o \
|
|
||||||
queue/gk.o \
|
|
||||||
pushback/rate-limit.o pushback/rate-limit-strategy.o \
|
|
||||||
pushback/ident-tree.o pushback/agg-spec.o \
|
|
||||||
pushback/logging-data-struct.o \
|
|
||||||
pushback/rate-estimator.o \
|
|
||||||
pushback/pushback-queue.o pushback/pushback.o \
|
|
||||||
common/parentnode.o trace/basetrace.o \
|
|
||||||
common/simulator.o asim/asim.o \
|
|
||||||
@V_STLOBJ@
|
|
||||||
|
|
||||||
|
|
||||||
# don't allow comments to follow continuation lines
|
|
||||||
|
|
||||||
# mac-csma.o mac-multihop.o\
|
|
||||||
# sensor-nets/landmark.o mac-simple-wireless.o \
|
|
||||||
# sensor-nets/tags.o sensor-nets/sensor-query.o \
|
|
||||||
# sensor-nets/flood-agent.o \
|
|
||||||
|
|
||||||
# what was here before is now in emulate/
|
|
||||||
OBJ_C =
|
|
||||||
|
|
||||||
OBJ_COMPAT = $(OBJ_GETOPT) common/win32.o
|
|
||||||
#XXX compat/win32x.o compat/tkConsole.o
|
|
||||||
|
|
||||||
OBJ_EMULATE_CC = \
|
|
||||||
emulate/net-ip.o \
|
|
||||||
emulate/net.o \
|
|
||||||
emulate/tap.o \
|
|
||||||
emulate/ether.o \
|
|
||||||
emulate/internet.o \
|
|
||||||
emulate/ping_responder.o \
|
|
||||||
emulate/arp.o \
|
|
||||||
emulate/icmp.o \
|
|
||||||
emulate/net-pcap.o \
|
|
||||||
emulate/nat.o \
|
|
||||||
emulate/iptap.o \
|
|
||||||
emulate/tcptap.o
|
|
||||||
|
|
||||||
OBJ_EMULATE_C = \
|
|
||||||
emulate/inet.o
|
|
||||||
|
|
||||||
OBJ_GEN = $(GEN_DIR)version.o $(GEN_DIR)ns_tcl.o $(GEN_DIR)ptypes.o
|
|
||||||
|
|
||||||
OBJ_PROTOLIB_CPP = \
|
|
||||||
protolib/ns/nsProtoAgent.o protolib/common/protoSim.o \
|
|
||||||
protolib/common/networkAddress.o protolib/common/protocolTimer.o \
|
|
||||||
protolib/common/debug.o
|
|
||||||
|
|
||||||
OBJ_MDP_CPP = \
|
|
||||||
mdp/ns/nsMdpAgent.o mdp/common/mdpSimAgent.o \
|
|
||||||
mdp/common/mdpBitMask.o mdp/common/mdpMessage.o \
|
|
||||||
mdp/common/mdpEncoder.o mdp/common/galois.o \
|
|
||||||
mdp/common/mdpSession.o mdp/common/mdpMsgHandler.o \
|
|
||||||
mdp/common/mdpNode.o mdp/common/mdpObject.o \
|
|
||||||
mdp/unix/mdpFile.o
|
|
||||||
|
|
||||||
OBJ_NORM_CPP = \
|
|
||||||
norm/ns/nsNormAgent.o norm/common/normSimAgent.o \
|
|
||||||
norm/common/normMessage.o norm/common/normSession.o \
|
|
||||||
norm/common/normNode.o norm/common/normObject.o \
|
|
||||||
norm/common/normSegment.o norm/common/normBitmask.o \
|
|
||||||
norm/common/normEncoder.o norm/common/galois.o \
|
|
||||||
norm/common/normFile.o
|
|
||||||
|
|
||||||
OBJ_CPP = $(OBJ_PROTOLIB_CPP) $(OBJ_MDP_CPP) $(OBJ_NORM_CPP)
|
|
||||||
|
|
||||||
SRC = $(OBJ_C:.o=.c) $(OBJ_CC:.o=.cc) $(OBJ_CPP:.o=.cpp) \
|
|
||||||
$(OBJ_EMULATE_C:.o=.c) $(OBJ_EMULATE_CC:.o=.cc) \
|
|
||||||
common/tclAppInit.cc common/tkAppInit.cc
|
|
||||||
|
|
||||||
OBJ = $(OBJ_C) $(OBJ_CC) $(OBJ_GEN) $(OBJ_COMPAT) $(OBJ_CPP)
|
|
||||||
|
|
||||||
CLEANFILES = ns nse nsx ns.dyn $(OBJ) $(OBJ_EMULATE_CC) \
|
|
||||||
$(OBJ_EMULATE_C) common/tclAppInit.o \
|
|
||||||
$(GEN_DIR)* $(NS).core core core.$(NS) core.$(NSX) core.$(NSE) \
|
|
||||||
common/ptypes2tcl common/ptypes2tcl.o
|
|
||||||
|
|
||||||
SUBDIRS=\
|
|
||||||
indep-utils/cmu-scen-gen/setdest \
|
|
||||||
indep-utils/webtrace-conv/dec \
|
|
||||||
indep-utils/webtrace-conv/epa \
|
|
||||||
indep-utils/webtrace-conv/nlanr \
|
|
||||||
indep-utils/webtrace-conv/ucb
|
|
||||||
|
|
||||||
BUILD_NSE = @build_nse@
|
|
||||||
|
|
||||||
all: $(NS) $(BUILD_NSE) all-recursive
|
|
||||||
|
|
||||||
|
|
||||||
all-recursive:
|
|
||||||
for i in $(SUBDIRS); do ( cd $$i; $(MAKE) all; ) done
|
|
||||||
|
|
||||||
$(NS): $(OBJ) common/tclAppInit.o Makefile
|
|
||||||
$(LINK) $(LDFLAGS) $(LDOUT)$@ \
|
|
||||||
common/tclAppInit.o $(OBJ) $(LIB)
|
|
||||||
|
|
||||||
Makefile: Makefile.in
|
|
||||||
@echo "Makefile.in is newer than Makefile."
|
|
||||||
@echo "You need to re-run configure."
|
|
||||||
false
|
|
||||||
|
|
||||||
$(NSE): $(OBJ) common/tclAppInit.o $(OBJ_EMULATE_CC) $(OBJ_EMULATE_C)
|
|
||||||
$(LINK) $(LDFLAGS) $(LDOUT)$@ \
|
|
||||||
common/tclAppInit.o $(OBJ) \
|
|
||||||
$(OBJ_EMULATE_CC) $(OBJ_EMULATE_C) $(LIB)
|
|
||||||
|
|
||||||
ns.dyn: $(OBJ) common/tclAppInit.o
|
|
||||||
$(LINK) $(LDFLAGS) -o $@ \
|
|
||||||
common/tclAppInit.o $(OBJ) $(LIB)
|
|
||||||
|
|
||||||
PURIFY = purify -cache-dir=/tmp
|
|
||||||
ns-pure: $(OBJ) common/tclAppInit.o
|
|
||||||
$(PURIFY) $(LINK) $(LDFLAGS) -o $@ \
|
|
||||||
common/tclAppInit.o $(OBJ) $(LIB)
|
|
||||||
|
|
||||||
NS_TCL_LIB = \
|
|
||||||
tcl/lib/ns-compat.tcl \
|
|
||||||
tcl/lib/ns-default.tcl \
|
|
||||||
tcl/lib/ns-errmodel.tcl \
|
|
||||||
tcl/lib/ns-lib.tcl \
|
|
||||||
tcl/lib/ns-link.tcl \
|
|
||||||
tcl/lib/ns-mobilenode.tcl \
|
|
||||||
tcl/lib/ns-sat.tcl \
|
|
||||||
tcl/lib/ns-cmutrace.tcl \
|
|
||||||
tcl/lib/ns-node.tcl \
|
|
||||||
tcl/lib/ns-rtmodule.tcl \
|
|
||||||
tcl/lib/ns-hiernode.tcl \
|
|
||||||
tcl/lib/ns-packet.tcl \
|
|
||||||
tcl/lib/ns-queue.tcl \
|
|
||||||
tcl/lib/ns-source.tcl \
|
|
||||||
tcl/lib/ns-nam.tcl \
|
|
||||||
tcl/lib/ns-trace.tcl \
|
|
||||||
tcl/lib/ns-agent.tcl \
|
|
||||||
tcl/lib/ns-random.tcl \
|
|
||||||
tcl/lib/ns-namsupp.tcl \
|
|
||||||
tcl/lib/ns-address.tcl \
|
|
||||||
tcl/lib/ns-intserv.tcl \
|
|
||||||
tcl/lib/ns-autoconf.tcl \
|
|
||||||
tcl/rtp/session-rtp.tcl \
|
|
||||||
tcl/lib/ns-mip.tcl \
|
|
||||||
tcl/rtglib/dynamics.tcl \
|
|
||||||
tcl/rtglib/route-proto.tcl \
|
|
||||||
tcl/rtglib/algo-route-proto.tcl \
|
|
||||||
tcl/rtglib/ns-rtProtoLS.tcl \
|
|
||||||
tcl/interface/ns-iface.tcl \
|
|
||||||
tcl/mcast/BST.tcl \
|
|
||||||
tcl/mcast/ns-mcast.tcl \
|
|
||||||
tcl/mcast/McastProto.tcl \
|
|
||||||
tcl/mcast/DM.tcl \
|
|
||||||
tcl/mcast/srm.tcl \
|
|
||||||
tcl/mcast/srm-adaptive.tcl \
|
|
||||||
tcl/mcast/srm-ssm.tcl \
|
|
||||||
tcl/mcast/timer.tcl \
|
|
||||||
tcl/mcast/McastMonitor.tcl \
|
|
||||||
tcl/mcast/mftp_snd.tcl \
|
|
||||||
tcl/mcast/mftp_rcv.tcl \
|
|
||||||
tcl/mcast/mftp_rcv_stat.tcl \
|
|
||||||
tcl/mobility/dsdv.tcl \
|
|
||||||
tcl/mobility/dsr.tcl \
|
|
||||||
tcl/ctr-mcast/CtrMcast.tcl \
|
|
||||||
tcl/ctr-mcast/CtrMcastComp.tcl \
|
|
||||||
tcl/ctr-mcast/CtrRPComp.tcl \
|
|
||||||
tcl/rlm/rlm.tcl \
|
|
||||||
tcl/rlm/rlm-ns.tcl \
|
|
||||||
tcl/session/session.tcl \
|
|
||||||
tcl/lib/ns-route.tcl \
|
|
||||||
tcl/emulate/ns-emulate.tcl \
|
|
||||||
tcl/lan/vlan.tcl \
|
|
||||||
tcl/lan/abslan.tcl \
|
|
||||||
tcl/lan/ns-ll.tcl \
|
|
||||||
tcl/lan/ns-mac.tcl \
|
|
||||||
tcl/webcache/http-agent.tcl \
|
|
||||||
tcl/webcache/http-server.tcl \
|
|
||||||
tcl/webcache/http-cache.tcl \
|
|
||||||
tcl/webcache/http-mcache.tcl \
|
|
||||||
tcl/webcache/webtraf.tcl \
|
|
||||||
tcl/webcache/empweb.tcl \
|
|
||||||
tcl/webcache/empftp.tcl \
|
|
||||||
tcl/plm/plm.tcl \
|
|
||||||
tcl/plm/plm-ns.tcl \
|
|
||||||
tcl/plm/plm-topo.tcl \
|
|
||||||
tcl/mpls/ns-mpls-classifier.tcl \
|
|
||||||
tcl/mpls/ns-mpls-ldpagent.tcl \
|
|
||||||
tcl/mpls/ns-mpls-node.tcl \
|
|
||||||
tcl/mpls/ns-mpls-simulator.tcl \
|
|
||||||
tcl/lib/ns-pushback.tcl \
|
|
||||||
tcl/lib/ns-srcrt.tcl \
|
|
||||||
@V_NS_TCL_LIB_STL@
|
|
||||||
|
|
||||||
$(GEN_DIR)ns_tcl.cc: $(NS_TCL_LIB)
|
|
||||||
$(TCLSH) bin/tcl-expand.tcl tcl/lib/ns-lib.tcl @V_NS_TCL_LIB_STL@ | $(TCL2C) et_ns_lib > $@
|
|
||||||
|
|
||||||
$(GEN_DIR)version.c: VERSION
|
|
||||||
$(RM) $@
|
|
||||||
$(TCLSH) bin/string2c.tcl version_string < VERSION > $@
|
|
||||||
|
|
||||||
$(GEN_DIR)ptypes.cc: common/ptypes2tcl common/packet.h
|
|
||||||
./common/ptypes2tcl > $@
|
|
||||||
|
|
||||||
common/ptypes2tcl: common/ptypes2tcl.o
|
|
||||||
$(LINK) $(LDFLAGS) $(LDOUT)$@ common/ptypes2tcl.o
|
|
||||||
|
|
||||||
common/ptypes2tcl.o: common/ptypes2tcl.cc common/packet.h
|
|
||||||
|
|
||||||
install: force install-ns install-man install-recursive
|
|
||||||
|
|
||||||
install-ns: force
|
|
||||||
$(INSTALL) -m 555 -o bin -g bin ns $(DESTDIR)$(BINDEST)
|
|
||||||
|
|
||||||
install-man: force
|
|
||||||
$(INSTALL) -m 444 -o bin -g bin ns.1 $(DESTDIR)$(MANDEST)/man1
|
|
||||||
|
|
||||||
install-recursive: force
|
|
||||||
for i in $(SUBDIRS); do ( cd $$i; $(MAKE) install; ) done
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) $(CLEANFILES)
|
|
||||||
|
|
||||||
AUTOCONF_GEN = tcl/lib/ns-autoconf.tcl
|
|
||||||
distclean:
|
|
||||||
$(RM) $(CLEANFILES) Makefile config.cache config.log config.status \
|
|
||||||
gnuc.h os-proto.h $(AUTOCONF_GEN); \
|
|
||||||
$(MV) .configure .configure- ;\
|
|
||||||
echo "Moved .configure to .configure-"
|
|
||||||
|
|
||||||
tags: force
|
|
||||||
ctags -wtd *.cc *.h webcache/*.cc webcache/*.h dsdv/*.cc dsdv/*.h \
|
|
||||||
dsr/*.cc dsr/*.h webcache/*.cc webcache/*.h lib/*.cc lib/*.h \
|
|
||||||
../Tcl/*.cc ../Tcl/*.h
|
|
||||||
|
|
||||||
TAGS: force
|
|
||||||
etags *.cc *.h webcache/*.cc webcache/*.h dsdv/*.cc dsdv/*.h \
|
|
||||||
dsr/*.cc dsr/*.h webcache/*.cc webcache/*.h lib/*.cc lib/*.h \
|
|
||||||
../Tcl/*.cc ../Tcl/*.h
|
|
||||||
|
|
||||||
tcl/lib/TAGS: force
|
|
||||||
( \
|
|
||||||
cd tcl/lib; \
|
|
||||||
$(TCLSH) ../../bin/tcl-expand.tcl ns-lib.tcl | grep '^### tcl-expand.tcl: begin' | awk '{print $$5}' >.tcl_files; \
|
|
||||||
etags --lang=none -r '/^[ \t]*proc[ \t]+\([^ \t]+\)/\1/' `cat .tcl_files`; \
|
|
||||||
etags --append --lang=none -r '/^\([A-Z][^ \t]+\)[ \t]+\(instproc\|proc\)[ \t]+\([^ \t]+\)[ \t]+/\1::\3/' `cat .tcl_files`; \
|
|
||||||
)
|
|
||||||
|
|
||||||
depend: $(SRC)
|
|
||||||
$(MKDEP) $(CFLAGS) $(INCLUDES) $(SRC)
|
|
||||||
|
|
||||||
srctar:
|
|
||||||
@cwd=`pwd` ; dir=`basename $$cwd` ; \
|
|
||||||
name=ns-`cat VERSION | tr A-Z a-z` ; \
|
|
||||||
tar=ns-src-`cat VERSION`.tar.gz ; \
|
|
||||||
list="" ; \
|
|
||||||
for i in `cat FILES` ; do list="$$list $$name/$$i" ; done; \
|
|
||||||
echo \
|
|
||||||
"(rm -f $$tar; cd .. ; ln -s $$dir $$name)" ; \
|
|
||||||
(rm -f $$tar; cd .. ; ln -s $$dir $$name) ; \
|
|
||||||
echo \
|
|
||||||
"(cd .. ; tar cfh $$tar [lots of files])" ; \
|
|
||||||
(cd .. ; tar cfh - $$list) | gzip -c > $$tar ; \
|
|
||||||
echo \
|
|
||||||
"rm ../$$name; chmod 444 $$tar" ; \
|
|
||||||
rm ../$$name; chmod 444 $$tar
|
|
||||||
|
|
||||||
force:
|
|
||||||
|
|
||||||
test: force
|
|
||||||
./validate
|
|
||||||
|
|
||||||
# Create makefile.vc for Win32 development by replacing:
|
|
||||||
# "# !include ..." -> "!include ..."
|
|
||||||
makefile.vc: Makefile.in
|
|
||||||
$(PERL) bin/gen-vcmake.pl < Makefile.in > makefile.vc
|
|
||||||
# $(PERL) -pe 's/^# (\!include)/\!include/o' < Makefile.in > makefile.vc
|
|
||||||
|
|
@ -0,0 +1,135 @@
|
||||||
|
// This code tests our NORM FEC encoder/decoder implementations
|
||||||
|
|
||||||
|
|
||||||
|
#include "protoTime.h" // for ProtoTime
|
||||||
|
|
||||||
|
#include "normEncoderRS8.h"
|
||||||
|
#include "normEncoderRS16.h"
|
||||||
|
|
||||||
|
#include <string.h> // for memcpy(), etc
|
||||||
|
#include <stdlib.h> // for rand()
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
const unsigned int NUM_PARITY = 100;
|
||||||
|
const unsigned int NUM_DATA = 400;
|
||||||
|
const unsigned int SHORT_DATA = 400;
|
||||||
|
const unsigned int SEG_SIZE = 64;
|
||||||
|
|
||||||
|
const unsigned int B_SIZE = (SHORT_DATA + NUM_PARITY);
|
||||||
|
|
||||||
|
#define NORM_ENCODER NormEncoderRS16
|
||||||
|
#define NORM_DECODER NormDecoderRS16
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
// Uncomment to seed random generator
|
||||||
|
ProtoTime currentTime;
|
||||||
|
currentTime.GetCurrentTime();
|
||||||
|
int seed = (unsigned int)currentTime.usec();
|
||||||
|
fprintf(stderr, "fect: seed = %u\n", seed);
|
||||||
|
srand(seed);
|
||||||
|
|
||||||
|
NORM_ENCODER encoder;
|
||||||
|
encoder.Init(NUM_DATA, NUM_PARITY, SEG_SIZE);
|
||||||
|
NORM_DECODER decoder;
|
||||||
|
decoder.Init(NUM_DATA, NUM_PARITY, SEG_SIZE);
|
||||||
|
|
||||||
|
for (int trial = 0; trial < 2; trial++)
|
||||||
|
{
|
||||||
|
|
||||||
|
// 1) Create some "printable" source data
|
||||||
|
char txData[B_SIZE][SEG_SIZE];
|
||||||
|
char* txDataPtr[B_SIZE];
|
||||||
|
for (unsigned int i = 0 ; i < SHORT_DATA; i++)
|
||||||
|
{
|
||||||
|
txDataPtr[i] = txData[i];
|
||||||
|
memset(txDataPtr[i], 'a' + (i%26), SEG_SIZE - 1);
|
||||||
|
txDataPtr[i][SEG_SIZE - 1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2) Zero-init the parity vectors of our txData
|
||||||
|
for (unsigned int i = SHORT_DATA; i < B_SIZE; i++)
|
||||||
|
{
|
||||||
|
txDataPtr[i] = txData[i];
|
||||||
|
memset(txDataPtr[i], 0, SEG_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3) Run our encoder (and record CPU time)
|
||||||
|
ProtoTime startTime, stopTime;
|
||||||
|
startTime.GetCurrentTime();
|
||||||
|
for (unsigned int i = 0; i < SHORT_DATA; i++)
|
||||||
|
{
|
||||||
|
encoder.Encode(txDataPtr[i], txDataPtr + SHORT_DATA);
|
||||||
|
}
|
||||||
|
stopTime.GetCurrentTime();
|
||||||
|
double encodeTime = ProtoTime::Delta(stopTime, startTime);
|
||||||
|
|
||||||
|
// 4) Copy "txData" to our "rxData"
|
||||||
|
char rxData[B_SIZE][SEG_SIZE];
|
||||||
|
char* rxDataPtr[B_SIZE];
|
||||||
|
for (unsigned int i = 0; i < B_SIZE; i++)
|
||||||
|
{
|
||||||
|
rxDataPtr[i] = rxData[i];
|
||||||
|
memcpy(rxDataPtr[i], txDataPtr[i], SEG_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5) Randomly pick some number of erasures and their locations
|
||||||
|
unsigned int erasureCount = 2;//rand() % NUM_PARITY;
|
||||||
|
unsigned int erasureLocs[B_SIZE];
|
||||||
|
for (unsigned int i = 0; i < B_SIZE; i++)
|
||||||
|
erasureLocs[i] = i;
|
||||||
|
for (unsigned int i = 0; i < erasureCount; i++)
|
||||||
|
{
|
||||||
|
// We do a little random shuffle here to generate
|
||||||
|
// "erasureCount" unique erasure locations
|
||||||
|
unsigned int loc = i + (rand() % (B_SIZE - i));
|
||||||
|
unsigned int tmp = erasureLocs[i];
|
||||||
|
erasureLocs[i] = erasureLocs[loc];
|
||||||
|
erasureLocs[loc] = tmp;
|
||||||
|
}
|
||||||
|
// Sort the "erasureLocs" into order (important!)
|
||||||
|
for (unsigned int i = 0; i < erasureCount; i++)
|
||||||
|
{
|
||||||
|
for (unsigned int j = i+1; j < erasureCount; j++)
|
||||||
|
{
|
||||||
|
if (erasureLocs[j] < erasureLocs[i])
|
||||||
|
{
|
||||||
|
unsigned int tmp = erasureLocs[i];
|
||||||
|
erasureLocs[i] = erasureLocs[j];
|
||||||
|
erasureLocs[j] = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(stderr, "erasureCount: %u erasureLocs: ", erasureCount);
|
||||||
|
for (unsigned int i = 0; i < erasureCount; i++)
|
||||||
|
fprintf(stderr, "%u ", erasureLocs[i]);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
|
||||||
|
// 6) Clear our erasure locs
|
||||||
|
for (unsigned int i = 0; i < erasureCount; i++)
|
||||||
|
memset(rxDataPtr[erasureLocs[i]], 0, SEG_SIZE);
|
||||||
|
|
||||||
|
// 7) Decode the rxData
|
||||||
|
|
||||||
|
|
||||||
|
startTime.GetCurrentTime();
|
||||||
|
decoder.Decode(rxDataPtr, SHORT_DATA, erasureCount, erasureLocs);
|
||||||
|
stopTime.GetCurrentTime();
|
||||||
|
double decodeTime = ProtoTime::Delta(stopTime, startTime);
|
||||||
|
|
||||||
|
// 8) check decoding
|
||||||
|
for (unsigned int i = 0; i < SHORT_DATA; i++)
|
||||||
|
{
|
||||||
|
if (0 != memcmp(rxDataPtr[i], txDataPtr[i], SEG_SIZE))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "fect: segment:%d rxData decode error!\n", i);
|
||||||
|
fprintf(stderr, " txData: %.32s ...\n", txDataPtr[i]);
|
||||||
|
fprintf(stderr, " rxData: %.32s ...\n", rxDataPtr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 9) Print results
|
||||||
|
fprintf(stderr, "fect: encodeTime:%lf usec decodeTime:%lf usec\n", 1.0e+06*encodeTime, 1.0e+06*decodeTime);
|
||||||
|
}
|
||||||
|
} // end main()
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue