1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2012 David Hoeppner. All rights reserved.
14 */
15
16 #include <sys/types.h>
17 #include <sys/stream.h>
18 #include <sys/debug.h>
19 #include <sys/cmn_err.h>
20 #include <inet/dccp_impl.h>
21 #include <inet/dccp_stack.h>
22
23 /*
24 * This file contains functions to parse and process DCCP features.
25 */
26
27 /*
28 * Feature handling.
29 */
30 int
31 dccp_parse_feature(dccp_t *dccp, uint8_t option, uint8_t length, uchar_t *up,
32 boolean_t mandatory)
33 {
34 dccp_feature_t *feature;
35 uint64_t feature_value;
36 uint8_t feature_type;
37 uint8_t feature_length = length - 1;
38
39 cmn_err(CE_NOTE, "dccp_features.c: dccp_parse_feature");
40
41 feature_type = *up;
42 up++;
43
44 switch (feature_type) {
45 case DCCP_FEATURE_CCID:
46 cmn_err(CE_NOTE, "DCCP_FEATURE_CCID");
47 break;
48 case DCCP_FEATURE_ALLOW_SHORT_SEQNOS:
49 cmn_err(CE_NOTE, "DCCP_FEATURE_ALLOW_SHORT_SEQNOS");
50 break;
51 case DCCP_FEATURE_SEQUENCE_WINDOW:
52 cmn_err(CE_NOTE, "DCCP_FEATURE_SEQUENCE_WINDOW");
53 if (feature_length != 6)
54 return (DCCP_RESET_MANDATORY_ERROR);
55
56 feature_value = (uint64_t)up[0] << 40;
57 feature_value += ((uint64_t)up[1] << 32);
58 feature_value += ((uint64_t)up[2] << 24);
59 feature_value += ((uint64_t)up[3] << 16);
60 feature_value += ((uint64_t)up[4] << 8);
61 feature_value += (uint64_t)up[5];
62
63 if (feature_value < 32 || feature_value > 70368744177663)
64 return (DCCP_RESET_MANDATORY_ERROR);
65 dccp->dccp_sequence_window = feature_value;
66 break;
67 case DCCP_FEATURE_ECN_INCAPABLE:
68 cmn_err(CE_NOTE, "DCCP_FEATURE_ECN_INCAPABLE");
69 break;
70 case DCCP_FEATURE_ACK_RATIO:
71 cmn_err(CE_NOTE, "DCCP_FEATURE_ACK_RATIO");
72 break;
73 case DCCP_FEATURE_SEND_ACK_VECTOR:
74 cmn_err(CE_NOTE, "DCCP_FEATURE_SEND_ACK_VECTOR");
75 break;
76 case DCCP_FEATURE_SEND_NDP_COUNT:
77 cmn_err(CE_NOTE, "DCCP_FEATURE_SEND_NDP_COUNT");
78 break;
79 case DCCP_FEATURE_MIN_CHECKSUM_COVERAGE:
80 cmn_err(CE_NOTE, "DCCP_FEATURE_MIN_CHECKSUM_COVERAGE");
81 break;
82 case DCCP_FEATURE_CHECK_DATA_CHECKSUM:
83 cmn_err(CE_NOTE, "DCCP_FEATURE_CHECK_DATA_CHECKSUM");
84 break;
85 default:
86 cmn_err(CE_NOTE, "ERROR DEFAULT");
87 break;
88 }
89
90 cmn_err(CE_NOTE, "feature len: %d", feature_length);
91
92 feature = (dccp_feature_t *)kmem_alloc(sizeof (dccp_feature_t),
93 KM_SLEEP);
94 if (feature == NULL) {
95 return (0);
96 }
97
98 feature->df_option = option;
99 feature->df_type = feature_type;
100 feature->df_mandatory = mandatory;
101
102 list_insert_tail(&dccp->dccp_features, feature);
103
104 return (0);
105 }
106
107 void
108 dccp_features_init(void)
109 {
110 }
111
112 void
113 dccp_features_destroy(void)
114 {
115 }