summaryrefslogtreecommitdiffstats
path: root/3rdparty/openpgm-svn-r1135/pgm/plan.txt
blob: b1747aefeca62cca86537b8fb2b785c345caeb35 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
pgmdump
-------

View all packets like tcpdump, but updated to full spec and allow dump of payload.


pgmtop
------

Dump realtime packet statistics in a ncurses display, mix of top/htop/netop.


basic_send
----------

Send an ODATA packet and terminate.

Accept string payload and network parameters on command line.

Send to multicast or send to unicast AFI.

IPv4/6.

Define optional session start, late join tags.


spm_idle
--------

Idle in an event loop sending out SPM packets.


stream_send
-----------

Send a constant stream of ODATA and SPM packets.


basic_http
----------

Simple embedded web server


basic_recv
----------

Listen to packets indicating data loss, view details through web interface.


basic_container
---------------

Test performance of glib containers for fast allocating for a dynamic transmit window.


basic_txw
---------

Test performance of a basic transmit window implementation.


nak_txw
-------

Test performance of random access to packets inside the window.


stream_send_with_nak
--------------------

Respond to NAK's with RDATA.


basic_recv_with_nak
-------------------

Listen to packets and send NAK's to rebuild data.


dumpif
------

Display all IP based interfaces and basic details.


testif
------

Test various combinations of network specification.


sw_calc
-------

Basic calculation tests of wrap-around sliding windows and a leading edge.


basic_recv_with_rxw
-------------------

Listen to packets buffered with a receive window.


test_cpu_timers
---------------

Calculate drift between processors, cores, and hyper-threads.


pgmsend
--------

basic_send updated to use transmit window.


pgmrecv
--------

basic_recv_with_rxw without web interface, primary displays messages from pgmsend.


syncrecv
--------

pgmrecv implemented outside GLib with a synchronous coding paradigm.


pgmping
-------

Dual mode: one to send fixed messages like pgmsend and listen for response, two to listen for
messages and reply.


block_send
----------

Send APDUs over ODATA.


(pgmrecv can receive APDUs)

test_rs
-------

Test 8-bit symbol Reed Solomon encoding and decoding with errors & erasures.

test_fec
--------

Test fec creation and recovery.


send_with_fec
--------------------

Send APDUs over ODATA with FEC.



Scenarios to reproduce
**********************

- Packet loss in stream causing NAK generation.
- Link saturation in sending causing API feedback.
- Link peak stable speed.
- Maxium NAK generation to determine NCF/RDATA throughput.
- Corrupt packets with invalid IP checksum (? generate IP HDR in sender)
- Corrupt packets with invalid PGM checksum.
- Invalid packet values.
- NAK to NCF latency.
- NAK to RDATA latency.
- Publish bandwidth: total, per packet type, payload, per recipient (?)
- Subscribe bandwidth: total, per packet type, payload, per publisher (?)
- Restarting a session with similar or dissimilar sequence numbering.

Outstanding questions
*********************

- Is it faster to use chunks containing multiple packets instead of one MTU
  per packet.  Does aligning with system page size matter?
- Can g_timers be dropped easily for gettimeofday and avoid floating point math?  Possible
  to pass timer upstream with contiguous data for easy access.
- Can time evaluation be dropped to at most once per main loop event?
- Does code work 32 bit and is it optimal?
- Should trash stacks be monitored and controlled externally?  For example, clearing
  up after bursts or administrative control.
- Should trash stacks have a upper limit to then free to the slice allocator?
- Should lost packets be managed as ranges or individual sequence numbers, how
  does each method affect performance?

* The initial draft of PGM included OPT_RANGE option for NAKs to specify a range of lost
  packets, this was replaced in the final draft with NAK lists.  Some research hints that
  ranges are suitable:

  http://www.isoc.org/inet2001/CD_proceedings/T54/T54.htm
  http://tools.ietf.org/html/draft-speakman-pgm-spec-01

- Are place holders necessary?  Can state timeouts be managed without a per sequence number
  object?  For example by the next data object, or an extra object for an ncf extended window:
  note that nak packet generation should easily dwarfs time spent unless advantage is taken
  of the additional 62 naks in a opt_nak_list.  Caution has to be taken with the cost of 
  splitting a range when a packet is inserted in the middle, although idealy it should
  be sequential from the trailing edge.
- Is it better to have send sockets per transport, or shared, bound to each interface?
- Cost of sharing state helper lists between receive windows?  On culling a peer the lists
  have to be purged.  Saves iterating the hash list of receivers.
- Encapsulated UDP lists two ports, 3305 for broadcast, 3306 for unicast, how is this 
  supposed to map to regular PGM, and why the split?

Basic TODO list
***************

- Ensure standardised error handling and status reporting.
- Implement mechanism for data-loss feedback.
- OPT_SYN & OPT_FIN on sending side.
- Shared trash stacks between multiple receive windows (contexts).
- Shared trash stacks between transmit and receive windows.
- FEC: compatibility with SmartPGM FEC, MS FEC?
- NAK backoff learning.
- Full conformance testing. (nak backoffs remaining)
- Unit testing.
- System testing with valgrind.
- Performance testing with oprofile.
- Basic DLR.
- Implement PGM sender (only) support thread?
- eventfd instead of pipes for recent Linux kernels.

Optionals
*********

- Some form of broadcast statistics for passive monitoring.
- (fix) BCH Reed-Solomon codec as possibly faster alternative, albeit incompatible with Microsoft.
- Recommendations as per the RMT working group of the IETF for AL-FEC codecs: Raptor codes, LDPC-
  staircase and LDPC-triangle codes.
- XDR based messaging format as example of binary encoded messaging.