Coverage Report

Created: 2026-09-03 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/strongswan/src/libcharon/encoding/payloads/unknown_payload.c
Line
Count
Source
1
/*
2
 * Copyright (C) 2015 Tobias Brunner
3
 * Copyright (C) 2005-2006 Martin Willi
4
 * Copyright (C) 2005 Jan Hutter
5
 *
6
 * Copyright (C) secunet Security Networks AG
7
 *
8
 * This program is free software; you can redistribute it and/or modify it
9
 * under the terms of the GNU General Public License as published by the
10
 * Free Software Foundation; either version 2 of the License, or (at your
11
 * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
12
 *
13
 * This program is distributed in the hope that it will be useful, but
14
 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15
 * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16
 * for more details.
17
 */
18
19
#include <stddef.h>
20
21
#include "unknown_payload.h"
22
23
typedef struct private_unknown_payload_t private_unknown_payload_t;
24
25
/**
26
 * Private data of an unknown_payload_t object.
27
 */
28
struct private_unknown_payload_t {
29
30
  /**
31
   * Public unknown_payload_t interface.
32
   */
33
  unknown_payload_t public;
34
35
  /**
36
   * Type of this payload
37
   */
38
  payload_type_t type;
39
40
  /**
41
   * Next payload type.
42
   */
43
  uint8_t next_payload;
44
45
  /**
46
   * Critical flag.
47
   */
48
  bool critical;
49
50
  /**
51
   * Reserved bits
52
   */
53
  bool reserved[7];
54
55
  /**
56
   * Length of this payload.
57
   */
58
  uint16_t payload_length;
59
60
  /**
61
   * The contained data.
62
   */
63
  chunk_t data;
64
};
65
66
/**
67
 * Encoding rules to parse an payload which is not further specified.
68
 *
69
 * The defined offsets are the positions in a object of type
70
 * private_unknown_payload_t.
71
 *
72
 */
73
static encoding_rule_t encodings[] = {
74
  /* 1 Byte next payload type, stored in the field next_payload */
75
  { U_INT_8,      offsetof(private_unknown_payload_t, next_payload) },
76
  /* the critical bit */
77
  { FLAG,       offsetof(private_unknown_payload_t, critical)   },
78
  /* 7 Bit reserved bits */
79
  { RESERVED_BIT,   offsetof(private_unknown_payload_t, reserved[0])  },
80
  { RESERVED_BIT,   offsetof(private_unknown_payload_t, reserved[1])  },
81
  { RESERVED_BIT,   offsetof(private_unknown_payload_t, reserved[2])  },
82
  { RESERVED_BIT,   offsetof(private_unknown_payload_t, reserved[3])  },
83
  { RESERVED_BIT,   offsetof(private_unknown_payload_t, reserved[4])  },
84
  { RESERVED_BIT,   offsetof(private_unknown_payload_t, reserved[5])  },
85
  { RESERVED_BIT,   offsetof(private_unknown_payload_t, reserved[6])  },
86
  /* Length of the whole payload*/
87
  { PAYLOAD_LENGTH, offsetof(private_unknown_payload_t, payload_length) },
88
  /* some unknown data bytes, length is defined in PAYLOAD_LENGTH */
89
  { CHUNK_DATA,   offsetof(private_unknown_payload_t, data)     },
90
};
91
92
/*
93
                           1                   2                   3
94
        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
95
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
96
       ! Next Payload  !C!  RESERVED   !         Payload Length        !
97
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
98
       !                                                               !
99
       ~                       Data of any type                        ~
100
       !                                                               !
101
       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
102
*/
103
104
METHOD(payload_t, verify, status_t,
105
  private_unknown_payload_t *this)
106
30.0k
{
107
30.0k
  return SUCCESS;
108
30.0k
}
109
110
METHOD(payload_t, get_encoding_rules, int,
111
  private_unknown_payload_t *this, encoding_rule_t **rules)
112
30.2k
{
113
30.2k
  *rules = encodings;
114
30.2k
  return countof(encodings);
115
30.2k
}
116
117
METHOD(payload_t, get_header_length, int,
118
  private_unknown_payload_t *this)
119
361k
{
120
361k
  return 4;
121
361k
}
122
123
METHOD(payload_t, get_payload_type, payload_type_t,
124
  private_unknown_payload_t *this)
125
49.2k
{
126
49.2k
  return PL_UNKNOWN;
127
49.2k
}
128
129
METHOD(unknown_payload_t, get_type, payload_type_t,
130
  private_unknown_payload_t *this)
131
0
{
132
0
  return this->type;
133
0
}
134
135
METHOD(payload_t, get_next_type, payload_type_t,
136
  private_unknown_payload_t *this)
137
30.0k
{
138
30.0k
  return this->next_payload;
139
30.0k
}
140
141
METHOD(payload_t, set_next_type, void,
142
  private_unknown_payload_t *this,payload_type_t type)
143
0
{
144
0
  this->next_payload = type;
145
0
}
146
147
METHOD(payload_t, get_length, size_t,
148
  private_unknown_payload_t *this)
149
0
{
150
0
  return this->payload_length;
151
0
}
152
153
METHOD(unknown_payload_t, is_critical, bool,
154
  private_unknown_payload_t *this)
155
0
{
156
0
  return this->critical;
157
0
}
158
159
METHOD(unknown_payload_t, get_data, chunk_t,
160
  private_unknown_payload_t *this)
161
0
{
162
0
  return this->data;
163
0
}
164
165
METHOD2(payload_t, unknown_payload_t, destroy, void,
166
  private_unknown_payload_t *this)
167
30.2k
{
168
30.2k
  free(this->data.ptr);
169
30.2k
  free(this);
170
30.2k
}
171
172
/*
173
 * Described in header
174
 */
175
unknown_payload_t *unknown_payload_create(payload_type_t type)
176
30.2k
{
177
30.2k
  private_unknown_payload_t *this;
178
179
30.2k
  INIT(this,
180
30.2k
    .public = {
181
30.2k
      .payload_interface = {
182
30.2k
        .verify = _verify,
183
30.2k
        .get_encoding_rules = _get_encoding_rules,
184
30.2k
        .get_header_length = _get_header_length,
185
30.2k
        .get_length = _get_length,
186
30.2k
        .get_next_type = _get_next_type,
187
30.2k
        .set_next_type = _set_next_type,
188
30.2k
        .get_type = _get_payload_type,
189
30.2k
        .destroy = _destroy,
190
30.2k
      },
191
30.2k
      .is_critical = _is_critical,
192
30.2k
      .get_type = _get_type,
193
30.2k
      .get_data = _get_data,
194
30.2k
      .destroy = _destroy,
195
30.2k
    },
196
30.2k
    .next_payload = PL_NONE,
197
30.2k
    .payload_length = get_header_length(this),
198
30.2k
    .type = type,
199
30.2k
  );
200
201
30.2k
  return &this->public;
202
30.2k
}
203
204
205
/*
206
 * Described in header
207
 */
208
unknown_payload_t *unknown_payload_create_data(payload_type_t type,
209
                         bool critical, chunk_t data)
210
0
{
211
0
  private_unknown_payload_t *this;
212
213
0
  this = (private_unknown_payload_t*)unknown_payload_create(type);
214
0
  this->data = data;
215
0
  this->critical = critical;
216
0
  this->payload_length = get_header_length(this) + data.len;
217
218
0
  return &this->public;
219
0
}