Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/net/dccp/feat.c
15109 views
1
/*
2
* net/dccp/feat.c
3
*
4
* Feature negotiation for the DCCP protocol (RFC 4340, section 6)
5
*
6
* Copyright (c) 2008 Gerrit Renker <[email protected]>
7
* Rewrote from scratch, some bits from earlier code by
8
* Copyright (c) 2005 Andrea Bittau <[email protected]>
9
*
10
*
11
* ASSUMPTIONS
12
* -----------
13
* o Feature negotiation is coordinated with connection setup (as in TCP), wild
14
* changes of parameters of an established connection are not supported.
15
* o All currently known SP features have 1-byte quantities. If in the future
16
* extensions of RFCs 4340..42 define features with item lengths larger than
17
* one byte, a feature-specific extension of the code will be required.
18
*
19
* This program is free software; you can redistribute it and/or
20
* modify it under the terms of the GNU General Public License
21
* as published by the Free Software Foundation; either version
22
* 2 of the License, or (at your option) any later version.
23
*/
24
#include <linux/module.h>
25
#include <linux/slab.h>
26
#include "ccid.h"
27
#include "feat.h"
28
29
/* feature-specific sysctls - initialised to the defaults from RFC 4340, 6.4 */
30
unsigned long sysctl_dccp_sequence_window __read_mostly = 100;
31
int sysctl_dccp_rx_ccid __read_mostly = 2,
32
sysctl_dccp_tx_ccid __read_mostly = 2;
33
34
/*
35
* Feature activation handlers.
36
*
37
* These all use an u64 argument, to provide enough room for NN/SP features. At
38
* this stage the negotiated values have been checked to be within their range.
39
*/
40
static int dccp_hdlr_ccid(struct sock *sk, u64 ccid, bool rx)
41
{
42
struct dccp_sock *dp = dccp_sk(sk);
43
struct ccid *new_ccid = ccid_new(ccid, sk, rx);
44
45
if (new_ccid == NULL)
46
return -ENOMEM;
47
48
if (rx) {
49
ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk);
50
dp->dccps_hc_rx_ccid = new_ccid;
51
} else {
52
ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk);
53
dp->dccps_hc_tx_ccid = new_ccid;
54
}
55
return 0;
56
}
57
58
static int dccp_hdlr_seq_win(struct sock *sk, u64 seq_win, bool rx)
59
{
60
struct dccp_sock *dp = dccp_sk(sk);
61
62
if (rx) {
63
dp->dccps_r_seq_win = seq_win;
64
/* propagate changes to update SWL/SWH */
65
dccp_update_gsr(sk, dp->dccps_gsr);
66
} else {
67
dp->dccps_l_seq_win = seq_win;
68
/* propagate changes to update AWL */
69
dccp_update_gss(sk, dp->dccps_gss);
70
}
71
return 0;
72
}
73
74
static int dccp_hdlr_ack_ratio(struct sock *sk, u64 ratio, bool rx)
75
{
76
if (rx)
77
dccp_sk(sk)->dccps_r_ack_ratio = ratio;
78
else
79
dccp_sk(sk)->dccps_l_ack_ratio = ratio;
80
return 0;
81
}
82
83
static int dccp_hdlr_ackvec(struct sock *sk, u64 enable, bool rx)
84
{
85
struct dccp_sock *dp = dccp_sk(sk);
86
87
if (rx) {
88
if (enable && dp->dccps_hc_rx_ackvec == NULL) {
89
dp->dccps_hc_rx_ackvec = dccp_ackvec_alloc(gfp_any());
90
if (dp->dccps_hc_rx_ackvec == NULL)
91
return -ENOMEM;
92
} else if (!enable) {
93
dccp_ackvec_free(dp->dccps_hc_rx_ackvec);
94
dp->dccps_hc_rx_ackvec = NULL;
95
}
96
}
97
return 0;
98
}
99
100
static int dccp_hdlr_ndp(struct sock *sk, u64 enable, bool rx)
101
{
102
if (!rx)
103
dccp_sk(sk)->dccps_send_ndp_count = (enable > 0);
104
return 0;
105
}
106
107
/*
108
* Minimum Checksum Coverage is located at the RX side (9.2.1). This means that
109
* `rx' holds when the sending peer informs about his partial coverage via a
110
* ChangeR() option. In the other case, we are the sender and the receiver
111
* announces its coverage via ChangeL() options. The policy here is to honour
112
* such communication by enabling the corresponding partial coverage - but only
113
* if it has not been set manually before; the warning here means that all
114
* packets will be dropped.
115
*/
116
static int dccp_hdlr_min_cscov(struct sock *sk, u64 cscov, bool rx)
117
{
118
struct dccp_sock *dp = dccp_sk(sk);
119
120
if (rx)
121
dp->dccps_pcrlen = cscov;
122
else {
123
if (dp->dccps_pcslen == 0)
124
dp->dccps_pcslen = cscov;
125
else if (cscov > dp->dccps_pcslen)
126
DCCP_WARN("CsCov %u too small, peer requires >= %u\n",
127
dp->dccps_pcslen, (u8)cscov);
128
}
129
return 0;
130
}
131
132
static const struct {
133
u8 feat_num; /* DCCPF_xxx */
134
enum dccp_feat_type rxtx; /* RX or TX */
135
enum dccp_feat_type reconciliation; /* SP or NN */
136
u8 default_value; /* as in 6.4 */
137
int (*activation_hdlr)(struct sock *sk, u64 val, bool rx);
138
/*
139
* Lookup table for location and type of features (from RFC 4340/4342)
140
* +--------------------------+----+-----+----+----+---------+-----------+
141
* | Feature | Location | Reconc. | Initial | Section |
142
* | | RX | TX | SP | NN | Value | Reference |
143
* +--------------------------+----+-----+----+----+---------+-----------+
144
* | DCCPF_CCID | | X | X | | 2 | 10 |
145
* | DCCPF_SHORT_SEQNOS | | X | X | | 0 | 7.6.1 |
146
* | DCCPF_SEQUENCE_WINDOW | | X | | X | 100 | 7.5.2 |
147
* | DCCPF_ECN_INCAPABLE | X | | X | | 0 | 12.1 |
148
* | DCCPF_ACK_RATIO | | X | | X | 2 | 11.3 |
149
* | DCCPF_SEND_ACK_VECTOR | X | | X | | 0 | 11.5 |
150
* | DCCPF_SEND_NDP_COUNT | | X | X | | 0 | 7.7.2 |
151
* | DCCPF_MIN_CSUM_COVER | X | | X | | 0 | 9.2.1 |
152
* | DCCPF_DATA_CHECKSUM | X | | X | | 0 | 9.3.1 |
153
* | DCCPF_SEND_LEV_RATE | X | | X | | 0 | 4342/8.4 |
154
* +--------------------------+----+-----+----+----+---------+-----------+
155
*/
156
} dccp_feat_table[] = {
157
{ DCCPF_CCID, FEAT_AT_TX, FEAT_SP, 2, dccp_hdlr_ccid },
158
{ DCCPF_SHORT_SEQNOS, FEAT_AT_TX, FEAT_SP, 0, NULL },
159
{ DCCPF_SEQUENCE_WINDOW, FEAT_AT_TX, FEAT_NN, 100, dccp_hdlr_seq_win },
160
{ DCCPF_ECN_INCAPABLE, FEAT_AT_RX, FEAT_SP, 0, NULL },
161
{ DCCPF_ACK_RATIO, FEAT_AT_TX, FEAT_NN, 2, dccp_hdlr_ack_ratio},
162
{ DCCPF_SEND_ACK_VECTOR, FEAT_AT_RX, FEAT_SP, 0, dccp_hdlr_ackvec },
163
{ DCCPF_SEND_NDP_COUNT, FEAT_AT_TX, FEAT_SP, 0, dccp_hdlr_ndp },
164
{ DCCPF_MIN_CSUM_COVER, FEAT_AT_RX, FEAT_SP, 0, dccp_hdlr_min_cscov},
165
{ DCCPF_DATA_CHECKSUM, FEAT_AT_RX, FEAT_SP, 0, NULL },
166
{ DCCPF_SEND_LEV_RATE, FEAT_AT_RX, FEAT_SP, 0, NULL },
167
};
168
#define DCCP_FEAT_SUPPORTED_MAX ARRAY_SIZE(dccp_feat_table)
169
170
/**
171
* dccp_feat_index - Hash function to map feature number into array position
172
* Returns consecutive array index or -1 if the feature is not understood.
173
*/
174
static int dccp_feat_index(u8 feat_num)
175
{
176
/* The first 9 entries are occupied by the types from RFC 4340, 6.4 */
177
if (feat_num > DCCPF_RESERVED && feat_num <= DCCPF_DATA_CHECKSUM)
178
return feat_num - 1;
179
180
/*
181
* Other features: add cases for new feature types here after adding
182
* them to the above table.
183
*/
184
switch (feat_num) {
185
case DCCPF_SEND_LEV_RATE:
186
return DCCP_FEAT_SUPPORTED_MAX - 1;
187
}
188
return -1;
189
}
190
191
static u8 dccp_feat_type(u8 feat_num)
192
{
193
int idx = dccp_feat_index(feat_num);
194
195
if (idx < 0)
196
return FEAT_UNKNOWN;
197
return dccp_feat_table[idx].reconciliation;
198
}
199
200
static int dccp_feat_default_value(u8 feat_num)
201
{
202
int idx = dccp_feat_index(feat_num);
203
/*
204
* There are no default values for unknown features, so encountering a
205
* negative index here indicates a serious problem somewhere else.
206
*/
207
DCCP_BUG_ON(idx < 0);
208
209
return idx < 0 ? 0 : dccp_feat_table[idx].default_value;
210
}
211
212
/*
213
* Debugging and verbose-printing section
214
*/
215
static const char *dccp_feat_fname(const u8 feat)
216
{
217
static const char *const feature_names[] = {
218
[DCCPF_RESERVED] = "Reserved",
219
[DCCPF_CCID] = "CCID",
220
[DCCPF_SHORT_SEQNOS] = "Allow Short Seqnos",
221
[DCCPF_SEQUENCE_WINDOW] = "Sequence Window",
222
[DCCPF_ECN_INCAPABLE] = "ECN Incapable",
223
[DCCPF_ACK_RATIO] = "Ack Ratio",
224
[DCCPF_SEND_ACK_VECTOR] = "Send ACK Vector",
225
[DCCPF_SEND_NDP_COUNT] = "Send NDP Count",
226
[DCCPF_MIN_CSUM_COVER] = "Min. Csum Coverage",
227
[DCCPF_DATA_CHECKSUM] = "Send Data Checksum",
228
};
229
if (feat > DCCPF_DATA_CHECKSUM && feat < DCCPF_MIN_CCID_SPECIFIC)
230
return feature_names[DCCPF_RESERVED];
231
232
if (feat == DCCPF_SEND_LEV_RATE)
233
return "Send Loss Event Rate";
234
if (feat >= DCCPF_MIN_CCID_SPECIFIC)
235
return "CCID-specific";
236
237
return feature_names[feat];
238
}
239
240
static const char *const dccp_feat_sname[] = {
241
"DEFAULT", "INITIALISING", "CHANGING", "UNSTABLE", "STABLE",
242
};
243
244
#ifdef CONFIG_IP_DCCP_DEBUG
245
static const char *dccp_feat_oname(const u8 opt)
246
{
247
switch (opt) {
248
case DCCPO_CHANGE_L: return "Change_L";
249
case DCCPO_CONFIRM_L: return "Confirm_L";
250
case DCCPO_CHANGE_R: return "Change_R";
251
case DCCPO_CONFIRM_R: return "Confirm_R";
252
}
253
return NULL;
254
}
255
256
static void dccp_feat_printval(u8 feat_num, dccp_feat_val const *val)
257
{
258
u8 i, type = dccp_feat_type(feat_num);
259
260
if (val == NULL || (type == FEAT_SP && val->sp.vec == NULL))
261
dccp_pr_debug_cat("(NULL)");
262
else if (type == FEAT_SP)
263
for (i = 0; i < val->sp.len; i++)
264
dccp_pr_debug_cat("%s%u", i ? " " : "", val->sp.vec[i]);
265
else if (type == FEAT_NN)
266
dccp_pr_debug_cat("%llu", (unsigned long long)val->nn);
267
else
268
dccp_pr_debug_cat("unknown type %u", type);
269
}
270
271
static void dccp_feat_printvals(u8 feat_num, u8 *list, u8 len)
272
{
273
u8 type = dccp_feat_type(feat_num);
274
dccp_feat_val fval = { .sp.vec = list, .sp.len = len };
275
276
if (type == FEAT_NN)
277
fval.nn = dccp_decode_value_var(list, len);
278
dccp_feat_printval(feat_num, &fval);
279
}
280
281
static void dccp_feat_print_entry(struct dccp_feat_entry const *entry)
282
{
283
dccp_debug(" * %s %s = ", entry->is_local ? "local" : "remote",
284
dccp_feat_fname(entry->feat_num));
285
dccp_feat_printval(entry->feat_num, &entry->val);
286
dccp_pr_debug_cat(", state=%s %s\n", dccp_feat_sname[entry->state],
287
entry->needs_confirm ? "(Confirm pending)" : "");
288
}
289
290
#define dccp_feat_print_opt(opt, feat, val, len, mandatory) do { \
291
dccp_pr_debug("%s(%s, ", dccp_feat_oname(opt), dccp_feat_fname(feat));\
292
dccp_feat_printvals(feat, val, len); \
293
dccp_pr_debug_cat(") %s\n", mandatory ? "!" : ""); } while (0)
294
295
#define dccp_feat_print_fnlist(fn_list) { \
296
const struct dccp_feat_entry *___entry; \
297
\
298
dccp_pr_debug("List Dump:\n"); \
299
list_for_each_entry(___entry, fn_list, node) \
300
dccp_feat_print_entry(___entry); \
301
}
302
#else /* ! CONFIG_IP_DCCP_DEBUG */
303
#define dccp_feat_print_opt(opt, feat, val, len, mandatory)
304
#define dccp_feat_print_fnlist(fn_list)
305
#endif
306
307
static int __dccp_feat_activate(struct sock *sk, const int idx,
308
const bool is_local, dccp_feat_val const *fval)
309
{
310
bool rx;
311
u64 val;
312
313
if (idx < 0 || idx >= DCCP_FEAT_SUPPORTED_MAX)
314
return -1;
315
if (dccp_feat_table[idx].activation_hdlr == NULL)
316
return 0;
317
318
if (fval == NULL) {
319
val = dccp_feat_table[idx].default_value;
320
} else if (dccp_feat_table[idx].reconciliation == FEAT_SP) {
321
if (fval->sp.vec == NULL) {
322
/*
323
* This can happen when an empty Confirm is sent
324
* for an SP (i.e. known) feature. In this case
325
* we would be using the default anyway.
326
*/
327
DCCP_CRIT("Feature #%d undefined: using default", idx);
328
val = dccp_feat_table[idx].default_value;
329
} else {
330
val = fval->sp.vec[0];
331
}
332
} else {
333
val = fval->nn;
334
}
335
336
/* Location is RX if this is a local-RX or remote-TX feature */
337
rx = (is_local == (dccp_feat_table[idx].rxtx == FEAT_AT_RX));
338
339
dccp_debug(" -> activating %s %s, %sval=%llu\n", rx ? "RX" : "TX",
340
dccp_feat_fname(dccp_feat_table[idx].feat_num),
341
fval ? "" : "default ", (unsigned long long)val);
342
343
return dccp_feat_table[idx].activation_hdlr(sk, val, rx);
344
}
345
346
/* Test for "Req'd" feature (RFC 4340, 6.4) */
347
static inline int dccp_feat_must_be_understood(u8 feat_num)
348
{
349
return feat_num == DCCPF_CCID || feat_num == DCCPF_SHORT_SEQNOS ||
350
feat_num == DCCPF_SEQUENCE_WINDOW;
351
}
352
353
/* copy constructor, fval must not already contain allocated memory */
354
static int dccp_feat_clone_sp_val(dccp_feat_val *fval, u8 const *val, u8 len)
355
{
356
fval->sp.len = len;
357
if (fval->sp.len > 0) {
358
fval->sp.vec = kmemdup(val, len, gfp_any());
359
if (fval->sp.vec == NULL) {
360
fval->sp.len = 0;
361
return -ENOBUFS;
362
}
363
}
364
return 0;
365
}
366
367
static void dccp_feat_val_destructor(u8 feat_num, dccp_feat_val *val)
368
{
369
if (unlikely(val == NULL))
370
return;
371
if (dccp_feat_type(feat_num) == FEAT_SP)
372
kfree(val->sp.vec);
373
memset(val, 0, sizeof(*val));
374
}
375
376
static struct dccp_feat_entry *
377
dccp_feat_clone_entry(struct dccp_feat_entry const *original)
378
{
379
struct dccp_feat_entry *new;
380
u8 type = dccp_feat_type(original->feat_num);
381
382
if (type == FEAT_UNKNOWN)
383
return NULL;
384
385
new = kmemdup(original, sizeof(struct dccp_feat_entry), gfp_any());
386
if (new == NULL)
387
return NULL;
388
389
if (type == FEAT_SP && dccp_feat_clone_sp_val(&new->val,
390
original->val.sp.vec,
391
original->val.sp.len)) {
392
kfree(new);
393
return NULL;
394
}
395
return new;
396
}
397
398
static void dccp_feat_entry_destructor(struct dccp_feat_entry *entry)
399
{
400
if (entry != NULL) {
401
dccp_feat_val_destructor(entry->feat_num, &entry->val);
402
kfree(entry);
403
}
404
}
405
406
/*
407
* List management functions
408
*
409
* Feature negotiation lists rely on and maintain the following invariants:
410
* - each feat_num in the list is known, i.e. we know its type and default value
411
* - each feat_num/is_local combination is unique (old entries are overwritten)
412
* - SP values are always freshly allocated
413
* - list is sorted in increasing order of feature number (faster lookup)
414
*/
415
static struct dccp_feat_entry *dccp_feat_list_lookup(struct list_head *fn_list,
416
u8 feat_num, bool is_local)
417
{
418
struct dccp_feat_entry *entry;
419
420
list_for_each_entry(entry, fn_list, node) {
421
if (entry->feat_num == feat_num && entry->is_local == is_local)
422
return entry;
423
else if (entry->feat_num > feat_num)
424
break;
425
}
426
return NULL;
427
}
428
429
/**
430
* dccp_feat_entry_new - Central list update routine (called by all others)
431
* @head: list to add to
432
* @feat: feature number
433
* @local: whether the local (1) or remote feature with number @feat is meant
434
* This is the only constructor and serves to ensure the above invariants.
435
*/
436
static struct dccp_feat_entry *
437
dccp_feat_entry_new(struct list_head *head, u8 feat, bool local)
438
{
439
struct dccp_feat_entry *entry;
440
441
list_for_each_entry(entry, head, node)
442
if (entry->feat_num == feat && entry->is_local == local) {
443
dccp_feat_val_destructor(entry->feat_num, &entry->val);
444
return entry;
445
} else if (entry->feat_num > feat) {
446
head = &entry->node;
447
break;
448
}
449
450
entry = kmalloc(sizeof(*entry), gfp_any());
451
if (entry != NULL) {
452
entry->feat_num = feat;
453
entry->is_local = local;
454
list_add_tail(&entry->node, head);
455
}
456
return entry;
457
}
458
459
/**
460
* dccp_feat_push_change - Add/overwrite a Change option in the list
461
* @fn_list: feature-negotiation list to update
462
* @feat: one of %dccp_feature_numbers
463
* @local: whether local (1) or remote (0) @feat_num is meant
464
* @needs_mandatory: whether to use Mandatory feature negotiation options
465
* @fval: pointer to NN/SP value to be inserted (will be copied)
466
*/
467
static int dccp_feat_push_change(struct list_head *fn_list, u8 feat, u8 local,
468
u8 mandatory, dccp_feat_val *fval)
469
{
470
struct dccp_feat_entry *new = dccp_feat_entry_new(fn_list, feat, local);
471
472
if (new == NULL)
473
return -ENOMEM;
474
475
new->feat_num = feat;
476
new->is_local = local;
477
new->state = FEAT_INITIALISING;
478
new->needs_confirm = 0;
479
new->empty_confirm = 0;
480
new->val = *fval;
481
new->needs_mandatory = mandatory;
482
483
return 0;
484
}
485
486
/**
487
* dccp_feat_push_confirm - Add a Confirm entry to the FN list
488
* @fn_list: feature-negotiation list to add to
489
* @feat: one of %dccp_feature_numbers
490
* @local: whether local (1) or remote (0) @feat_num is being confirmed
491
* @fval: pointer to NN/SP value to be inserted or NULL
492
* Returns 0 on success, a Reset code for further processing otherwise.
493
*/
494
static int dccp_feat_push_confirm(struct list_head *fn_list, u8 feat, u8 local,
495
dccp_feat_val *fval)
496
{
497
struct dccp_feat_entry *new = dccp_feat_entry_new(fn_list, feat, local);
498
499
if (new == NULL)
500
return DCCP_RESET_CODE_TOO_BUSY;
501
502
new->feat_num = feat;
503
new->is_local = local;
504
new->state = FEAT_STABLE; /* transition in 6.6.2 */
505
new->needs_confirm = 1;
506
new->empty_confirm = (fval == NULL);
507
new->val.nn = 0; /* zeroes the whole structure */
508
if (!new->empty_confirm)
509
new->val = *fval;
510
new->needs_mandatory = 0;
511
512
return 0;
513
}
514
515
static int dccp_push_empty_confirm(struct list_head *fn_list, u8 feat, u8 local)
516
{
517
return dccp_feat_push_confirm(fn_list, feat, local, NULL);
518
}
519
520
static inline void dccp_feat_list_pop(struct dccp_feat_entry *entry)
521
{
522
list_del(&entry->node);
523
dccp_feat_entry_destructor(entry);
524
}
525
526
void dccp_feat_list_purge(struct list_head *fn_list)
527
{
528
struct dccp_feat_entry *entry, *next;
529
530
list_for_each_entry_safe(entry, next, fn_list, node)
531
dccp_feat_entry_destructor(entry);
532
INIT_LIST_HEAD(fn_list);
533
}
534
EXPORT_SYMBOL_GPL(dccp_feat_list_purge);
535
536
/* generate @to as full clone of @from - @to must not contain any nodes */
537
int dccp_feat_clone_list(struct list_head const *from, struct list_head *to)
538
{
539
struct dccp_feat_entry *entry, *new;
540
541
INIT_LIST_HEAD(to);
542
list_for_each_entry(entry, from, node) {
543
new = dccp_feat_clone_entry(entry);
544
if (new == NULL)
545
goto cloning_failed;
546
list_add_tail(&new->node, to);
547
}
548
return 0;
549
550
cloning_failed:
551
dccp_feat_list_purge(to);
552
return -ENOMEM;
553
}
554
555
/**
556
* dccp_feat_valid_nn_length - Enforce length constraints on NN options
557
* Length is between 0 and %DCCP_OPTVAL_MAXLEN. Used for outgoing packets only,
558
* incoming options are accepted as long as their values are valid.
559
*/
560
static u8 dccp_feat_valid_nn_length(u8 feat_num)
561
{
562
if (feat_num == DCCPF_ACK_RATIO) /* RFC 4340, 11.3 and 6.6.8 */
563
return 2;
564
if (feat_num == DCCPF_SEQUENCE_WINDOW) /* RFC 4340, 7.5.2 and 6.5 */
565
return 6;
566
return 0;
567
}
568
569
static u8 dccp_feat_is_valid_nn_val(u8 feat_num, u64 val)
570
{
571
switch (feat_num) {
572
case DCCPF_ACK_RATIO:
573
return val <= DCCPF_ACK_RATIO_MAX;
574
case DCCPF_SEQUENCE_WINDOW:
575
return val >= DCCPF_SEQ_WMIN && val <= DCCPF_SEQ_WMAX;
576
}
577
return 0; /* feature unknown - so we can't tell */
578
}
579
580
/* check that SP values are within the ranges defined in RFC 4340 */
581
static u8 dccp_feat_is_valid_sp_val(u8 feat_num, u8 val)
582
{
583
switch (feat_num) {
584
case DCCPF_CCID:
585
return val == DCCPC_CCID2 || val == DCCPC_CCID3;
586
/* Type-check Boolean feature values: */
587
case DCCPF_SHORT_SEQNOS:
588
case DCCPF_ECN_INCAPABLE:
589
case DCCPF_SEND_ACK_VECTOR:
590
case DCCPF_SEND_NDP_COUNT:
591
case DCCPF_DATA_CHECKSUM:
592
case DCCPF_SEND_LEV_RATE:
593
return val < 2;
594
case DCCPF_MIN_CSUM_COVER:
595
return val < 16;
596
}
597
return 0; /* feature unknown */
598
}
599
600
static u8 dccp_feat_sp_list_ok(u8 feat_num, u8 const *sp_list, u8 sp_len)
601
{
602
if (sp_list == NULL || sp_len < 1)
603
return 0;
604
while (sp_len--)
605
if (!dccp_feat_is_valid_sp_val(feat_num, *sp_list++))
606
return 0;
607
return 1;
608
}
609
610
/**
611
* dccp_feat_insert_opts - Generate FN options from current list state
612
* @skb: next sk_buff to be sent to the peer
613
* @dp: for client during handshake and general negotiation
614
* @dreq: used by the server only (all Changes/Confirms in LISTEN/RESPOND)
615
*/
616
int dccp_feat_insert_opts(struct dccp_sock *dp, struct dccp_request_sock *dreq,
617
struct sk_buff *skb)
618
{
619
struct list_head *fn = dreq ? &dreq->dreq_featneg : &dp->dccps_featneg;
620
struct dccp_feat_entry *pos, *next;
621
u8 opt, type, len, *ptr, nn_in_nbo[DCCP_OPTVAL_MAXLEN];
622
bool rpt;
623
624
/* put entries into @skb in the order they appear in the list */
625
list_for_each_entry_safe_reverse(pos, next, fn, node) {
626
opt = dccp_feat_genopt(pos);
627
type = dccp_feat_type(pos->feat_num);
628
rpt = false;
629
630
if (pos->empty_confirm) {
631
len = 0;
632
ptr = NULL;
633
} else {
634
if (type == FEAT_SP) {
635
len = pos->val.sp.len;
636
ptr = pos->val.sp.vec;
637
rpt = pos->needs_confirm;
638
} else if (type == FEAT_NN) {
639
len = dccp_feat_valid_nn_length(pos->feat_num);
640
ptr = nn_in_nbo;
641
dccp_encode_value_var(pos->val.nn, ptr, len);
642
} else {
643
DCCP_BUG("unknown feature %u", pos->feat_num);
644
return -1;
645
}
646
}
647
dccp_feat_print_opt(opt, pos->feat_num, ptr, len, 0);
648
649
if (dccp_insert_fn_opt(skb, opt, pos->feat_num, ptr, len, rpt))
650
return -1;
651
if (pos->needs_mandatory && dccp_insert_option_mandatory(skb))
652
return -1;
653
/*
654
* Enter CHANGING after transmitting the Change option (6.6.2).
655
*/
656
if (pos->state == FEAT_INITIALISING)
657
pos->state = FEAT_CHANGING;
658
}
659
return 0;
660
}
661
662
/**
663
* __feat_register_nn - Register new NN value on socket
664
* @fn: feature-negotiation list to register with
665
* @feat: an NN feature from %dccp_feature_numbers
666
* @mandatory: use Mandatory option if 1
667
* @nn_val: value to register (restricted to 4 bytes)
668
* Note that NN features are local by definition (RFC 4340, 6.3.2).
669
*/
670
static int __feat_register_nn(struct list_head *fn, u8 feat,
671
u8 mandatory, u64 nn_val)
672
{
673
dccp_feat_val fval = { .nn = nn_val };
674
675
if (dccp_feat_type(feat) != FEAT_NN ||
676
!dccp_feat_is_valid_nn_val(feat, nn_val))
677
return -EINVAL;
678
679
/* Don't bother with default values, they will be activated anyway. */
680
if (nn_val - (u64)dccp_feat_default_value(feat) == 0)
681
return 0;
682
683
return dccp_feat_push_change(fn, feat, 1, mandatory, &fval);
684
}
685
686
/**
687
* __feat_register_sp - Register new SP value/list on socket
688
* @fn: feature-negotiation list to register with
689
* @feat: an SP feature from %dccp_feature_numbers
690
* @is_local: whether the local (1) or the remote (0) @feat is meant
691
* @mandatory: use Mandatory option if 1
692
* @sp_val: SP value followed by optional preference list
693
* @sp_len: length of @sp_val in bytes
694
*/
695
static int __feat_register_sp(struct list_head *fn, u8 feat, u8 is_local,
696
u8 mandatory, u8 const *sp_val, u8 sp_len)
697
{
698
dccp_feat_val fval;
699
700
if (dccp_feat_type(feat) != FEAT_SP ||
701
!dccp_feat_sp_list_ok(feat, sp_val, sp_len))
702
return -EINVAL;
703
704
/* Avoid negotiating alien CCIDs by only advertising supported ones */
705
if (feat == DCCPF_CCID && !ccid_support_check(sp_val, sp_len))
706
return -EOPNOTSUPP;
707
708
if (dccp_feat_clone_sp_val(&fval, sp_val, sp_len))
709
return -ENOMEM;
710
711
return dccp_feat_push_change(fn, feat, is_local, mandatory, &fval);
712
}
713
714
/**
715
* dccp_feat_register_sp - Register requests to change SP feature values
716
* @sk: client or listening socket
717
* @feat: one of %dccp_feature_numbers
718
* @is_local: whether the local (1) or remote (0) @feat is meant
719
* @list: array of preferred values, in descending order of preference
720
* @len: length of @list in bytes
721
*/
722
int dccp_feat_register_sp(struct sock *sk, u8 feat, u8 is_local,
723
u8 const *list, u8 len)
724
{ /* any changes must be registered before establishing the connection */
725
if (sk->sk_state != DCCP_CLOSED)
726
return -EISCONN;
727
if (dccp_feat_type(feat) != FEAT_SP)
728
return -EINVAL;
729
return __feat_register_sp(&dccp_sk(sk)->dccps_featneg, feat, is_local,
730
0, list, len);
731
}
732
733
734
/*
735
* Tracking features whose value depend on the choice of CCID
736
*
737
* This is designed with an extension in mind so that a list walk could be done
738
* before activating any features. However, the existing framework was found to
739
* work satisfactorily up until now, the automatic verification is left open.
740
* When adding new CCIDs, add a corresponding dependency table here.
741
*/
742
static const struct ccid_dependency *dccp_feat_ccid_deps(u8 ccid, bool is_local)
743
{
744
static const struct ccid_dependency ccid2_dependencies[2][2] = {
745
/*
746
* CCID2 mandates Ack Vectors (RFC 4341, 4.): as CCID is a TX
747
* feature and Send Ack Vector is an RX feature, `is_local'
748
* needs to be reversed.
749
*/
750
{ /* Dependencies of the receiver-side (remote) CCID2 */
751
{
752
.dependent_feat = DCCPF_SEND_ACK_VECTOR,
753
.is_local = true,
754
.is_mandatory = true,
755
.val = 1
756
},
757
{ 0, 0, 0, 0 }
758
},
759
{ /* Dependencies of the sender-side (local) CCID2 */
760
{
761
.dependent_feat = DCCPF_SEND_ACK_VECTOR,
762
.is_local = false,
763
.is_mandatory = true,
764
.val = 1
765
},
766
{ 0, 0, 0, 0 }
767
}
768
};
769
static const struct ccid_dependency ccid3_dependencies[2][5] = {
770
{ /*
771
* Dependencies of the receiver-side CCID3
772
*/
773
{ /* locally disable Ack Vectors */
774
.dependent_feat = DCCPF_SEND_ACK_VECTOR,
775
.is_local = true,
776
.is_mandatory = false,
777
.val = 0
778
},
779
{ /* see below why Send Loss Event Rate is on */
780
.dependent_feat = DCCPF_SEND_LEV_RATE,
781
.is_local = true,
782
.is_mandatory = true,
783
.val = 1
784
},
785
{ /* NDP Count is needed as per RFC 4342, 6.1.1 */
786
.dependent_feat = DCCPF_SEND_NDP_COUNT,
787
.is_local = false,
788
.is_mandatory = true,
789
.val = 1
790
},
791
{ 0, 0, 0, 0 },
792
},
793
{ /*
794
* CCID3 at the TX side: we request that the HC-receiver
795
* will not send Ack Vectors (they will be ignored, so
796
* Mandatory is not set); we enable Send Loss Event Rate
797
* (Mandatory since the implementation does not support
798
* the Loss Intervals option of RFC 4342, 8.6).
799
* The last two options are for peer's information only.
800
*/
801
{
802
.dependent_feat = DCCPF_SEND_ACK_VECTOR,
803
.is_local = false,
804
.is_mandatory = false,
805
.val = 0
806
},
807
{
808
.dependent_feat = DCCPF_SEND_LEV_RATE,
809
.is_local = false,
810
.is_mandatory = true,
811
.val = 1
812
},
813
{ /* this CCID does not support Ack Ratio */
814
.dependent_feat = DCCPF_ACK_RATIO,
815
.is_local = true,
816
.is_mandatory = false,
817
.val = 0
818
},
819
{ /* tell receiver we are sending NDP counts */
820
.dependent_feat = DCCPF_SEND_NDP_COUNT,
821
.is_local = true,
822
.is_mandatory = false,
823
.val = 1
824
},
825
{ 0, 0, 0, 0 }
826
}
827
};
828
switch (ccid) {
829
case DCCPC_CCID2:
830
return ccid2_dependencies[is_local];
831
case DCCPC_CCID3:
832
return ccid3_dependencies[is_local];
833
default:
834
return NULL;
835
}
836
}
837
838
/**
839
* dccp_feat_propagate_ccid - Resolve dependencies of features on choice of CCID
840
* @fn: feature-negotiation list to update
841
* @id: CCID number to track
842
* @is_local: whether TX CCID (1) or RX CCID (0) is meant
843
* This function needs to be called after registering all other features.
844
*/
845
static int dccp_feat_propagate_ccid(struct list_head *fn, u8 id, bool is_local)
846
{
847
const struct ccid_dependency *table = dccp_feat_ccid_deps(id, is_local);
848
int i, rc = (table == NULL);
849
850
for (i = 0; rc == 0 && table[i].dependent_feat != DCCPF_RESERVED; i++)
851
if (dccp_feat_type(table[i].dependent_feat) == FEAT_SP)
852
rc = __feat_register_sp(fn, table[i].dependent_feat,
853
table[i].is_local,
854
table[i].is_mandatory,
855
&table[i].val, 1);
856
else
857
rc = __feat_register_nn(fn, table[i].dependent_feat,
858
table[i].is_mandatory,
859
table[i].val);
860
return rc;
861
}
862
863
/**
864
* dccp_feat_finalise_settings - Finalise settings before starting negotiation
865
* @dp: client or listening socket (settings will be inherited)
866
* This is called after all registrations (socket initialisation, sysctls, and
867
* sockopt calls), and before sending the first packet containing Change options
868
* (ie. client-Request or server-Response), to ensure internal consistency.
869
*/
870
int dccp_feat_finalise_settings(struct dccp_sock *dp)
871
{
872
struct list_head *fn = &dp->dccps_featneg;
873
struct dccp_feat_entry *entry;
874
int i = 2, ccids[2] = { -1, -1 };
875
876
/*
877
* Propagating CCIDs:
878
* 1) not useful to propagate CCID settings if this host advertises more
879
* than one CCID: the choice of CCID may still change - if this is
880
* the client, or if this is the server and the client sends
881
* singleton CCID values.
882
* 2) since is that propagate_ccid changes the list, we defer changing
883
* the sorted list until after the traversal.
884
*/
885
list_for_each_entry(entry, fn, node)
886
if (entry->feat_num == DCCPF_CCID && entry->val.sp.len == 1)
887
ccids[entry->is_local] = entry->val.sp.vec[0];
888
while (i--)
889
if (ccids[i] > 0 && dccp_feat_propagate_ccid(fn, ccids[i], i))
890
return -1;
891
dccp_feat_print_fnlist(fn);
892
return 0;
893
}
894
895
/**
896
* dccp_feat_server_ccid_dependencies - Resolve CCID-dependent features
897
* It is the server which resolves the dependencies once the CCID has been
898
* fully negotiated. If no CCID has been negotiated, it uses the default CCID.
899
*/
900
int dccp_feat_server_ccid_dependencies(struct dccp_request_sock *dreq)
901
{
902
struct list_head *fn = &dreq->dreq_featneg;
903
struct dccp_feat_entry *entry;
904
u8 is_local, ccid;
905
906
for (is_local = 0; is_local <= 1; is_local++) {
907
entry = dccp_feat_list_lookup(fn, DCCPF_CCID, is_local);
908
909
if (entry != NULL && !entry->empty_confirm)
910
ccid = entry->val.sp.vec[0];
911
else
912
ccid = dccp_feat_default_value(DCCPF_CCID);
913
914
if (dccp_feat_propagate_ccid(fn, ccid, is_local))
915
return -1;
916
}
917
return 0;
918
}
919
920
/* Select the first entry in @servlist that also occurs in @clilist (6.3.1) */
921
static int dccp_feat_preflist_match(u8 *servlist, u8 slen, u8 *clilist, u8 clen)
922
{
923
u8 c, s;
924
925
for (s = 0; s < slen; s++)
926
for (c = 0; c < clen; c++)
927
if (servlist[s] == clilist[c])
928
return servlist[s];
929
return -1;
930
}
931
932
/**
933
* dccp_feat_prefer - Move preferred entry to the start of array
934
* Reorder the @array_len elements in @array so that @preferred_value comes
935
* first. Returns >0 to indicate that @preferred_value does occur in @array.
936
*/
937
static u8 dccp_feat_prefer(u8 preferred_value, u8 *array, u8 array_len)
938
{
939
u8 i, does_occur = 0;
940
941
if (array != NULL) {
942
for (i = 0; i < array_len; i++)
943
if (array[i] == preferred_value) {
944
array[i] = array[0];
945
does_occur++;
946
}
947
if (does_occur)
948
array[0] = preferred_value;
949
}
950
return does_occur;
951
}
952
953
/**
954
* dccp_feat_reconcile - Reconcile SP preference lists
955
* @fval: SP list to reconcile into
956
* @arr: received SP preference list
957
* @len: length of @arr in bytes
958
* @is_server: whether this side is the server (and @fv is the server's list)
959
* @reorder: whether to reorder the list in @fv after reconciling with @arr
960
* When successful, > 0 is returned and the reconciled list is in @fval.
961
* A value of 0 means that negotiation failed (no shared entry).
962
*/
963
static int dccp_feat_reconcile(dccp_feat_val *fv, u8 *arr, u8 len,
964
bool is_server, bool reorder)
965
{
966
int rc;
967
968
if (!fv->sp.vec || !arr) {
969
DCCP_CRIT("NULL feature value or array");
970
return 0;
971
}
972
973
if (is_server)
974
rc = dccp_feat_preflist_match(fv->sp.vec, fv->sp.len, arr, len);
975
else
976
rc = dccp_feat_preflist_match(arr, len, fv->sp.vec, fv->sp.len);
977
978
if (!reorder)
979
return rc;
980
if (rc < 0)
981
return 0;
982
983
/*
984
* Reorder list: used for activating features and in dccp_insert_fn_opt.
985
*/
986
return dccp_feat_prefer(rc, fv->sp.vec, fv->sp.len);
987
}
988
989
/**
990
* dccp_feat_change_recv - Process incoming ChangeL/R options
991
* @fn: feature-negotiation list to update
992
* @is_mandatory: whether the Change was preceded by a Mandatory option
993
* @opt: %DCCPO_CHANGE_L or %DCCPO_CHANGE_R
994
* @feat: one of %dccp_feature_numbers
995
* @val: NN value or SP value/preference list
996
* @len: length of @val in bytes
997
* @server: whether this node is the server (1) or the client (0)
998
*/
999
static u8 dccp_feat_change_recv(struct list_head *fn, u8 is_mandatory, u8 opt,
1000
u8 feat, u8 *val, u8 len, const bool server)
1001
{
1002
u8 defval, type = dccp_feat_type(feat);
1003
const bool local = (opt == DCCPO_CHANGE_R);
1004
struct dccp_feat_entry *entry;
1005
dccp_feat_val fval;
1006
1007
if (len == 0 || type == FEAT_UNKNOWN) /* 6.1 and 6.6.8 */
1008
goto unknown_feature_or_value;
1009
1010
dccp_feat_print_opt(opt, feat, val, len, is_mandatory);
1011
1012
/*
1013
* Negotiation of NN features: Change R is invalid, so there is no
1014
* simultaneous negotiation; hence we do not look up in the list.
1015
*/
1016
if (type == FEAT_NN) {
1017
if (local || len > sizeof(fval.nn))
1018
goto unknown_feature_or_value;
1019
1020
/* 6.3.2: "The feature remote MUST accept any valid value..." */
1021
fval.nn = dccp_decode_value_var(val, len);
1022
if (!dccp_feat_is_valid_nn_val(feat, fval.nn))
1023
goto unknown_feature_or_value;
1024
1025
return dccp_feat_push_confirm(fn, feat, local, &fval);
1026
}
1027
1028
/*
1029
* Unidirectional/simultaneous negotiation of SP features (6.3.1)
1030
*/
1031
entry = dccp_feat_list_lookup(fn, feat, local);
1032
if (entry == NULL) {
1033
/*
1034
* No particular preferences have been registered. We deal with
1035
* this situation by assuming that all valid values are equally
1036
* acceptable, and apply the following checks:
1037
* - if the peer's list is a singleton, we accept a valid value;
1038
* - if we are the server, we first try to see if the peer (the
1039
* client) advertises the default value. If yes, we use it,
1040
* otherwise we accept the preferred value;
1041
* - else if we are the client, we use the first list element.
1042
*/
1043
if (dccp_feat_clone_sp_val(&fval, val, 1))
1044
return DCCP_RESET_CODE_TOO_BUSY;
1045
1046
if (len > 1 && server) {
1047
defval = dccp_feat_default_value(feat);
1048
if (dccp_feat_preflist_match(&defval, 1, val, len) > -1)
1049
fval.sp.vec[0] = defval;
1050
} else if (!dccp_feat_is_valid_sp_val(feat, fval.sp.vec[0])) {
1051
kfree(fval.sp.vec);
1052
goto unknown_feature_or_value;
1053
}
1054
1055
/* Treat unsupported CCIDs like invalid values */
1056
if (feat == DCCPF_CCID && !ccid_support_check(fval.sp.vec, 1)) {
1057
kfree(fval.sp.vec);
1058
goto not_valid_or_not_known;
1059
}
1060
1061
return dccp_feat_push_confirm(fn, feat, local, &fval);
1062
1063
} else if (entry->state == FEAT_UNSTABLE) { /* 6.6.2 */
1064
return 0;
1065
}
1066
1067
if (dccp_feat_reconcile(&entry->val, val, len, server, true)) {
1068
entry->empty_confirm = 0;
1069
} else if (is_mandatory) {
1070
return DCCP_RESET_CODE_MANDATORY_ERROR;
1071
} else if (entry->state == FEAT_INITIALISING) {
1072
/*
1073
* Failed simultaneous negotiation (server only): try to `save'
1074
* the connection by checking whether entry contains the default
1075
* value for @feat. If yes, send an empty Confirm to signal that
1076
* the received Change was not understood - which implies using
1077
* the default value.
1078
* If this also fails, we use Reset as the last resort.
1079
*/
1080
WARN_ON(!server);
1081
defval = dccp_feat_default_value(feat);
1082
if (!dccp_feat_reconcile(&entry->val, &defval, 1, server, true))
1083
return DCCP_RESET_CODE_OPTION_ERROR;
1084
entry->empty_confirm = 1;
1085
}
1086
entry->needs_confirm = 1;
1087
entry->needs_mandatory = 0;
1088
entry->state = FEAT_STABLE;
1089
return 0;
1090
1091
unknown_feature_or_value:
1092
if (!is_mandatory)
1093
return dccp_push_empty_confirm(fn, feat, local);
1094
1095
not_valid_or_not_known:
1096
return is_mandatory ? DCCP_RESET_CODE_MANDATORY_ERROR
1097
: DCCP_RESET_CODE_OPTION_ERROR;
1098
}
1099
1100
/**
1101
* dccp_feat_confirm_recv - Process received Confirm options
1102
* @fn: feature-negotiation list to update
1103
* @is_mandatory: whether @opt was preceded by a Mandatory option
1104
* @opt: %DCCPO_CONFIRM_L or %DCCPO_CONFIRM_R
1105
* @feat: one of %dccp_feature_numbers
1106
* @val: NN value or SP value/preference list
1107
* @len: length of @val in bytes
1108
* @server: whether this node is server (1) or client (0)
1109
*/
1110
static u8 dccp_feat_confirm_recv(struct list_head *fn, u8 is_mandatory, u8 opt,
1111
u8 feat, u8 *val, u8 len, const bool server)
1112
{
1113
u8 *plist, plen, type = dccp_feat_type(feat);
1114
const bool local = (opt == DCCPO_CONFIRM_R);
1115
struct dccp_feat_entry *entry = dccp_feat_list_lookup(fn, feat, local);
1116
1117
dccp_feat_print_opt(opt, feat, val, len, is_mandatory);
1118
1119
if (entry == NULL) { /* nothing queued: ignore or handle error */
1120
if (is_mandatory && type == FEAT_UNKNOWN)
1121
return DCCP_RESET_CODE_MANDATORY_ERROR;
1122
1123
if (!local && type == FEAT_NN) /* 6.3.2 */
1124
goto confirmation_failed;
1125
return 0;
1126
}
1127
1128
if (entry->state != FEAT_CHANGING) /* 6.6.2 */
1129
return 0;
1130
1131
if (len == 0) {
1132
if (dccp_feat_must_be_understood(feat)) /* 6.6.7 */
1133
goto confirmation_failed;
1134
/*
1135
* Empty Confirm during connection setup: this means reverting
1136
* to the `old' value, which in this case is the default. Since
1137
* we handle default values automatically when no other values
1138
* have been set, we revert to the old value by removing this
1139
* entry from the list.
1140
*/
1141
dccp_feat_list_pop(entry);
1142
return 0;
1143
}
1144
1145
if (type == FEAT_NN) {
1146
if (len > sizeof(entry->val.nn))
1147
goto confirmation_failed;
1148
1149
if (entry->val.nn == dccp_decode_value_var(val, len))
1150
goto confirmation_succeeded;
1151
1152
DCCP_WARN("Bogus Confirm for non-existing value\n");
1153
goto confirmation_failed;
1154
}
1155
1156
/*
1157
* Parsing SP Confirms: the first element of @val is the preferred
1158
* SP value which the peer confirms, the remainder depends on @len.
1159
* Note that only the confirmed value need to be a valid SP value.
1160
*/
1161
if (!dccp_feat_is_valid_sp_val(feat, *val))
1162
goto confirmation_failed;
1163
1164
if (len == 1) { /* peer didn't supply a preference list */
1165
plist = val;
1166
plen = len;
1167
} else { /* preferred value + preference list */
1168
plist = val + 1;
1169
plen = len - 1;
1170
}
1171
1172
/* Check whether the peer got the reconciliation right (6.6.8) */
1173
if (dccp_feat_reconcile(&entry->val, plist, plen, server, 0) != *val) {
1174
DCCP_WARN("Confirm selected the wrong value %u\n", *val);
1175
return DCCP_RESET_CODE_OPTION_ERROR;
1176
}
1177
entry->val.sp.vec[0] = *val;
1178
1179
confirmation_succeeded:
1180
entry->state = FEAT_STABLE;
1181
return 0;
1182
1183
confirmation_failed:
1184
DCCP_WARN("Confirmation failed\n");
1185
return is_mandatory ? DCCP_RESET_CODE_MANDATORY_ERROR
1186
: DCCP_RESET_CODE_OPTION_ERROR;
1187
}
1188
1189
/**
1190
* dccp_feat_parse_options - Process Feature-Negotiation Options
1191
* @sk: for general use and used by the client during connection setup
1192
* @dreq: used by the server during connection setup
1193
* @mandatory: whether @opt was preceded by a Mandatory option
1194
* @opt: %DCCPO_CHANGE_L | %DCCPO_CHANGE_R | %DCCPO_CONFIRM_L | %DCCPO_CONFIRM_R
1195
* @feat: one of %dccp_feature_numbers
1196
* @val: value contents of @opt
1197
* @len: length of @val in bytes
1198
* Returns 0 on success, a Reset code for ending the connection otherwise.
1199
*/
1200
int dccp_feat_parse_options(struct sock *sk, struct dccp_request_sock *dreq,
1201
u8 mandatory, u8 opt, u8 feat, u8 *val, u8 len)
1202
{
1203
struct dccp_sock *dp = dccp_sk(sk);
1204
struct list_head *fn = dreq ? &dreq->dreq_featneg : &dp->dccps_featneg;
1205
bool server = false;
1206
1207
switch (sk->sk_state) {
1208
/*
1209
* Negotiation during connection setup
1210
*/
1211
case DCCP_LISTEN:
1212
server = true; /* fall through */
1213
case DCCP_REQUESTING:
1214
switch (opt) {
1215
case DCCPO_CHANGE_L:
1216
case DCCPO_CHANGE_R:
1217
return dccp_feat_change_recv(fn, mandatory, opt, feat,
1218
val, len, server);
1219
case DCCPO_CONFIRM_R:
1220
case DCCPO_CONFIRM_L:
1221
return dccp_feat_confirm_recv(fn, mandatory, opt, feat,
1222
val, len, server);
1223
}
1224
}
1225
return 0; /* ignore FN options in all other states */
1226
}
1227
1228
/**
1229
* dccp_feat_init - Seed feature negotiation with host-specific defaults
1230
* This initialises global defaults, depending on the value of the sysctls.
1231
* These can later be overridden by registering changes via setsockopt calls.
1232
* The last link in the chain is finalise_settings, to make sure that between
1233
* here and the start of actual feature negotiation no inconsistencies enter.
1234
*
1235
* All features not appearing below use either defaults or are otherwise
1236
* later adjusted through dccp_feat_finalise_settings().
1237
*/
1238
int dccp_feat_init(struct sock *sk)
1239
{
1240
struct list_head *fn = &dccp_sk(sk)->dccps_featneg;
1241
u8 on = 1, off = 0;
1242
int rc;
1243
struct {
1244
u8 *val;
1245
u8 len;
1246
} tx, rx;
1247
1248
/* Non-negotiable (NN) features */
1249
rc = __feat_register_nn(fn, DCCPF_SEQUENCE_WINDOW, 0,
1250
sysctl_dccp_sequence_window);
1251
if (rc)
1252
return rc;
1253
1254
/* Server-priority (SP) features */
1255
1256
/* Advertise that short seqnos are not supported (7.6.1) */
1257
rc = __feat_register_sp(fn, DCCPF_SHORT_SEQNOS, true, true, &off, 1);
1258
if (rc)
1259
return rc;
1260
1261
/* RFC 4340 12.1: "If a DCCP is not ECN capable, ..." */
1262
rc = __feat_register_sp(fn, DCCPF_ECN_INCAPABLE, true, true, &on, 1);
1263
if (rc)
1264
return rc;
1265
1266
/*
1267
* We advertise the available list of CCIDs and reorder according to
1268
* preferences, to avoid failure resulting from negotiating different
1269
* singleton values (which always leads to failure).
1270
* These settings can still (later) be overridden via sockopts.
1271
*/
1272
if (ccid_get_builtin_ccids(&tx.val, &tx.len) ||
1273
ccid_get_builtin_ccids(&rx.val, &rx.len))
1274
return -ENOBUFS;
1275
1276
if (!dccp_feat_prefer(sysctl_dccp_tx_ccid, tx.val, tx.len) ||
1277
!dccp_feat_prefer(sysctl_dccp_rx_ccid, rx.val, rx.len))
1278
goto free_ccid_lists;
1279
1280
rc = __feat_register_sp(fn, DCCPF_CCID, true, false, tx.val, tx.len);
1281
if (rc)
1282
goto free_ccid_lists;
1283
1284
rc = __feat_register_sp(fn, DCCPF_CCID, false, false, rx.val, rx.len);
1285
1286
free_ccid_lists:
1287
kfree(tx.val);
1288
kfree(rx.val);
1289
return rc;
1290
}
1291
1292
int dccp_feat_activate_values(struct sock *sk, struct list_head *fn_list)
1293
{
1294
struct dccp_sock *dp = dccp_sk(sk);
1295
struct dccp_feat_entry *cur, *next;
1296
int idx;
1297
dccp_feat_val *fvals[DCCP_FEAT_SUPPORTED_MAX][2] = {
1298
[0 ... DCCP_FEAT_SUPPORTED_MAX-1] = { NULL, NULL }
1299
};
1300
1301
list_for_each_entry(cur, fn_list, node) {
1302
/*
1303
* An empty Confirm means that either an unknown feature type
1304
* or an invalid value was present. In the first case there is
1305
* nothing to activate, in the other the default value is used.
1306
*/
1307
if (cur->empty_confirm)
1308
continue;
1309
1310
idx = dccp_feat_index(cur->feat_num);
1311
if (idx < 0) {
1312
DCCP_BUG("Unknown feature %u", cur->feat_num);
1313
goto activation_failed;
1314
}
1315
if (cur->state != FEAT_STABLE) {
1316
DCCP_CRIT("Negotiation of %s %s failed in state %s",
1317
cur->is_local ? "local" : "remote",
1318
dccp_feat_fname(cur->feat_num),
1319
dccp_feat_sname[cur->state]);
1320
goto activation_failed;
1321
}
1322
fvals[idx][cur->is_local] = &cur->val;
1323
}
1324
1325
/*
1326
* Activate in decreasing order of index, so that the CCIDs are always
1327
* activated as the last feature. This avoids the case where a CCID
1328
* relies on the initialisation of one or more features that it depends
1329
* on (e.g. Send NDP Count, Send Ack Vector, and Ack Ratio features).
1330
*/
1331
for (idx = DCCP_FEAT_SUPPORTED_MAX; --idx >= 0;)
1332
if (__dccp_feat_activate(sk, idx, 0, fvals[idx][0]) ||
1333
__dccp_feat_activate(sk, idx, 1, fvals[idx][1])) {
1334
DCCP_CRIT("Could not activate %d", idx);
1335
goto activation_failed;
1336
}
1337
1338
/* Clean up Change options which have been confirmed already */
1339
list_for_each_entry_safe(cur, next, fn_list, node)
1340
if (!cur->needs_confirm)
1341
dccp_feat_list_pop(cur);
1342
1343
dccp_pr_debug("Activation OK\n");
1344
return 0;
1345
1346
activation_failed:
1347
/*
1348
* We clean up everything that may have been allocated, since
1349
* it is difficult to track at which stage negotiation failed.
1350
* This is ok, since all allocation functions below are robust
1351
* against NULL arguments.
1352
*/
1353
ccid_hc_rx_delete(dp->dccps_hc_rx_ccid, sk);
1354
ccid_hc_tx_delete(dp->dccps_hc_tx_ccid, sk);
1355
dp->dccps_hc_rx_ccid = dp->dccps_hc_tx_ccid = NULL;
1356
dccp_ackvec_free(dp->dccps_hc_rx_ackvec);
1357
dp->dccps_hc_rx_ackvec = NULL;
1358
return -1;
1359
}
1360
1361