aboutsummaryrefslogtreecommitdiffstats
path: root/metis/ccnx/forwarder/metis/tlv/metis_TlvOps.h
blob: 35dae4905baae9e83fec3a823bc1e7bb7acfe78b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
/*
 * Copyright (c) 2017 Cisco and/or its affiliates.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @file metis_TlvOps.h
 * @brief The API for TLV schemas
 *
 * Each TLV schema must implement this API
 *
 */

#ifndef Metis_metis_TlvOps_h
#define Metis_metis_TlvOps_h

#include <stdbool.h>
#include <parc/algol/parc_Buffer.h>
#include <parc/security/parc_CryptoHash.h>
#include <ccnx/forwarder/metis/tlv/metis_TlvSkeleton.h>
#include <ccnx/api/control/cpi_ControlMessage.h>

typedef struct metis_tlv_ops {
    /**
     * Fills in the packet TLV skeleton
     *
     * The skeleton must have been initialized with the correct parser and packet buffer.
     *
     * @param [in] skeleton An allocated MetisTlvSkeleton to fill in
     *
     * @retval true Good parse
     * @retval false Error
     *
     * Example:
     * @code
     * <#example#>
     * @endcode
     */
    bool (*parse)(MetisTlvSkeleton *skeleton);

    /**
     * Computes the ContentObjectHash over a packet
     *
     * <#Paragraphs Of Explanation#>
     *
     * @param [in] packet Packet memory, pointing to byte 0 of the fixed header
     *
     * @return non-null The sha256 hash
     * @return null An error (or not a content object)
     *
     * Example:
     * @code
     * {
     *     <#example#>
     * }
     * @endcode
     */
    PARCCryptoHash * (*computeContentObjectHash)(const uint8_t *packet);

    /**
     * @function metisTlv_EncodeCPI
     * @abstract Encodes a CPI control message in TLV format
     * @discussion
     *   <#Discussion#>
     *
     * @param <#param1#>
     * @return An allocated message, must call <code>metisMessage_Destroy()</code> on it.
     */
    PARCBuffer *(*encodeControlPlaneInformation)(const CCNxControl *cpiControlMessage);

    /**
     * Returns the total header length based on the Fixed Header
     *
     * The length may be 0 for an unsupported FixedHeader version or other error.
     *
     * @param [in] packet Packet memory pointing to byte 0 of the Fixed Header
     *
     * @retval number Total header length
     *
     * Example:
     * @code
     * <#example#>
     * @endcode
     */
    size_t (*totalHeaderLength)(const uint8_t *packet);

    /**
     * Returns the total packet length based on the Fixed Header
     *
     * The length may be 0 for an unsupported FixedHeader version or other error.
     *
     * @param [in] packet Packet memory pointing to byte 0 of the Fixed Header
     *
     * @retval number Total packet length
     *
     * Example:
     * @code
     * <#example#>
     * @endcode
     */
    size_t (*totalPacketLength)(const uint8_t *packet);

    /**
     * Returns the length of the fixed header
     *
     * The length may be 0 for an unsupported FixedHeader version or other error.
     *
     * @param [in] packet Packet memory pointing to byte 0 of the Fixed Header
     *
     * @retval number Total packet length
     *
     * Example:
     * @code
     * <#example#>
     * @endcode
     */
    size_t (*fixedHeaderLength)(const uint8_t *packet);

    /**
     * Determines if the FixedHeader PacketType is Intereest
     *
     * <#Paragraphs Of Explanation#>
     *
     * @param [in] packet Packet memory, pointing to byte 0 of fixed header
     *
     * @retval true PacketType is Interest
     * @retval false PacketType is not Interest
     *
     * Example:
     * @code
     * <#example#>
     * @endcode
     */
    bool (*isPacketTypeInterest)(const uint8_t *packet);

    /**
     * Determines if the FixedHeader PacketType is ContentObject
     *
     * <#Paragraphs Of Explanation#>
     *
     * @param [in] packet Packet memory, pointing to byte 0 of fixed header
     *
     * @retval true PacketType is ContentObject
     * @retval false PacketType is not ContentObject
     *
     * Example:
     * @code
     * <#example#>
     * @endcode
     */
    bool (*isPacketTypeContentObject)(const uint8_t *packet);

    /**
     * Determines if the FixedHeader PacketType is InterestReturn
     *
     * <#Paragraphs Of Explanation#>
     *
     * @param [in] packet Packet memory, pointing to byte 0 of fixed header
     *
     * @retval true PacketType is InterestReturn
     * @retval false PacketType is not InterestReturn
     *
     * Example:
     * @code
     * <#example#>
     * @endcode
     */
    bool (*isPacketTypeInterestReturn)(const uint8_t *packet);

    /**
     * Determines if the FixedHeader PacketType is Control
     *
     * <#Paragraphs Of Explanation#>
     *
     * @param [in] packet Packet memory, pointing to byte 0 of fixed header
     *
     * @retval true PacketType is Control
     * @retval false PacketType is not Control
     *
     * Example:
     * @code
     * <#example#>
     * @endcode
     */
    bool (*isPacketTypeControl)(const uint8_t *packet);

    /**
     * Determines if the FixedHeader PacketType is Hop By Hop Fragment
     *
     * <#Paragraphs Of Explanation#>
     *
     * @param [in] packet Packet memory, pointing to byte 0 of fixed header
     *
     * @retval true PacketType is Hop By Hop Fragment
     * @retval false PacketType is not Hop By Hop Fragment
     *
     * Example:
     * @code
     * <#example#>
     * @endcode
     */
    bool (*isPacketTypeHopByHopFragment)(const uint8_t *packet);
} MetisTlvOps;


#endif // Metis_metis_TlvOps_h