Re: Report: feat negot state

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi guys!

Andrea Bittau wrote:
good.  only 2 queues:  one for "pending changes" and one for confirms.  You
might have wondered why i had a "confirm" inside the pending change queue
itself, and then a seperate confirm queue.

Basically, because i coded server priority features first, and then
non-negotiable.  With NN features, you need to send confirms even for stuff you
don't know about [or something like that] so i didn't know where to shove the
confirm =D

I don't quite understand this. If you don't know about the feature, then how can you tell whether it is NN?

Anyway, it's much better like this [i was planning to do it at some point, but i
just "died"]
/* Check if nothing is being changed. */
-	if (ccid_nr == new_ccid_nr)
+	/* XXX handle multibyte values */
+	if (ccid_nr == *val)
 		return 0;


ccid can only be 1 byte.  kill comment.  assert(len == 1);

It is worth pointing out here that ALL server-priority features specified in DCCP so far use one byte values. So I'd just hold off implementing multi-byte SP features.

+	rc = dccp_feat_change(dmsk, DCCPO_CHANGE_L, DCCPF_ACK_RATIO,
+			      &dmsk->dccpms_ack_ratio, 1, gfp);

ack ratio is 2 bytes i think.

Yep.

1) Merge it
2) I'll try to re-write the multi-byte feature support patch.  I believe this is
   important functionality which is missing.

For NN features, yes.

So now feature negotiation is moved into the minisock stuff.  I don't know what
it means exactly, but i think the minisock stuff is the socket created upon
receiving a SYN... i.e. a half open connection.  The idea is to keep as little
state as possible in order to avoid SYN floods and other lame dos attacks.

While I was writing feature negotiation, I spotted quite a nice dos attack.
Actually, probably it sucks, but here it is.

The idea is that when you send a REQUEST, you can include your CHANGE options.
The server will RESPOND with the various CONFIRM options.  Here are the nice
implications of this:

* The server must remember which CONFIRMs it sent.  [In fact, the previous code
  was bugged because of this I think---it would remember the features of ALL
  clients in a single socket... anyway.]

  This means that the server must not trash memory, it has to hold some state,
  and potentially even setup those options.  E.g. it might have to load a CCID,
  etc etc.

The Init Cookie option lets the server package up all that state, send it to the client, and forget it. The server might still have to load a CCID, but that doesn't worry me -- we only have 3 CCIDs.

* The server must actually calculate the CONFIRMS.  With server priority, the
  calculation works as follows:  Given preference list C and S of the client and
  server respectively, the winning value is the first value which appears in S
  and also in C.

  Basically:

  for each s in S
    for each c in C
      if (s == c)
        w00t();

It's not that bad. (1) All feature negotiation options are limited to 252 bytes of feature value at most. (2) All current SP features are one-byte valued. So you can do this.

    uint32_t bitmap[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; // 256 bits
    for each c in C
      turn on corresponding bit in bitmap;
    for each s in S
      if corresponding bit in bitmap is true
        w00t();

O(n^2) -> O(n).

For multi-byte SP features (if they ever exist), this trick doesn't work, but the DOS is less serious, since the maximum preference list length is 1/2 (1/3, 1/4...) as long.

E
-
: send the line "unsubscribe dccp" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [IETF DCCP]     [Linux Networking]     [Git]     [Security]     [Linux Assembly]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux