Hi Andrea,
I think what you are saying touches upon a very crucial issue and it is
necessary
to get these architectural issues `right', i.e. generic and scalable enough,
before
proceeding with other work (I'd be willing to put in effort).
The general problem is that the horizon does not end with CCID 2 and CCID 3,
rather:
* CCID 4 is already in the pipeline (draft-ietf-dccp-tfrc-voip-05) to become
RFC soon
* there is a proposed faster-restart variant for CCID 3/4, so we will have
CCID-3-`fr'
and CCID-4-`fr' variants besides the `plain' standardised CCID 3/4
* people at NEC have developed and implemented (Kame) yet another CCID-3
variant
more specifically designed for VoIP applications
* given the experimental state of using CCIDs in the Internet, it is more than
likely
that further CCIDs will soon evolve
Therefore the architectural concerns you are raising are of critical importance
for the
overall success of the Linux DCCP framework.
It is very much worth to focus on the architecture: a generic and
well-designed, modular
interface between main DCCP module and CCID `plug-ins' will save *much*
frustration and
having to revamp again in the future -- when more CCIDs are happily added to
the landscape.
I think it is wasting time to use temporary and non-scalable fixes and
therefore would
like to expand on the following comments you made:
| I don't think tx queueing immedeately "helps" solving this problem. It's an
| architectural change that I'm proposing. In the current API, DCCP is the
| "master" and asks the CCID if it can send. The CCID either says yes, or says
| "ask me again in X time". I don't think this is great because some CCIDs
don't
| really have a concept of time. In rate based protocols, perhaps there is a
way
| to say "OK I can send after X time" but in window based protocols it's "upon
the
| reception of the next ack". OK one can give an esitmate of time [rtt/cwnd?]
but
| it still isn't great.
|
| By reversing the architecture, I think this problem is solved quite neatly.
In
| this case, it is the CCID which drives DCCP. The API would be: CCID tells
DCCP
| "hey, you can send" and DCCP sends happilly. Not a poll & push model as
before,
| but rather a pull model from CCID's perspective.
<.....>
| To summarize, the API would be as follows. DCCP would implement:
| void pull(int x); /* Called by CCID, indicating that DCCP may send x
packets */
|
| CCID would implement:
| void notify(int true); /* if true, CCID will pull from DCCP, else not */
I have the following further discussion items regarding the CCID <=> main
module interface:
1/ TX Buffering: set size of TX ring buffer via socket option.
There are interesting simulations which confirm the merit of having such
and such
queue lenghts; the current code does not have a limit on the TX queue; and
I am
referring to an effective circular-list implementation in [LK05].
Maybe sendmsg() could just block if actual_qlen == max_qlen ??? The above
callbacks
seem a useful start here ==> suggestions?
2/ Keeping track of Maximum Packet Size (MPS, RFC 4340, sec. 14).
The main module needs to keep track of MPS which is influenced by CCMPS,
the MPS
determined by the CCID in use ==> need a way to communicate CCMPS to main
module
3/ Fragmentation.
MPS is also determined by path MTU (which appears to work). Currently,
unlike UDP,
EMSGSIZE is returned if buflen > MPS. The spec allows optional
fragmentation for
such cases where CCMPS <= buflen <= MPS. Again, the CCID needs to be set
first
(sockopt), then the CCMPS be communicated to main module.
4/ Interpretation/setting of the CCVal header field.
5/ Feature negotiation: the feature negotiation code also depends on current
CCID value.
API-wise, my understanding is that it all starts with setting the CCID socket
option where
apparently CCID 2 acts as common denominator, since
* new connections start with CCID 2 as default
* DCCP implementations "SHOULD implement at least CCID 2" [RFC 4340, sec. 10]
Hence if the CCID socket option is not set, fallback is CCID 2. Later, when
feature negotiation
is over, the actual CCID in place can be queried via getsockopt - and at that
time the CCID-in-place
is already communicating with the main module.
Lastly, a related issue is the use of the DCCP_SOCKOPT_PACKET_SIZE socket
option: this
is a strange something, again is CCID-specific, and no current use for it can
be seen
- Ian McDonald has a patch which removes it. I am still wondering whether and
if it has any
use at all?
Comments, please.
Gerrit.
[LK05] Lai, Junwen and Eddie Kohler. Efficiency and late data choice in
a user-kernel interface for congestion-controlled datagrams. In
Surendar Chandra and Nalini Venkatasubramanian, editors, Twelfth
Annual Multimedia Computing and Networking (MMCN '05), San Jose,
California, volume 5680 of Proceedings of the SPIE, pages
136--142. 2005.
-
To unsubscribe from this list: send the line "unsubscribe dccp" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html