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
|
/*
* Copyright (c) 2021-2022 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 request.h
* \brief Pending requests.
*/
#ifndef HC_REQUEST_H
#define HC_REQUEST_H
#include <stdbool.h>
#include <hicn/ctrl/action.h>
#include <hicn/ctrl/callback.h>
#include <hicn/ctrl/data.h>
#include <hicn/ctrl/object.h>
#if 0
typedef int (*HC_PARSE)(const uint8_t *, uint8_t *);
#endif
#define foreach_request_state \
_(UNDEFINED) \
_(INIT) \
_(CONNECTION_CREATE_LISTENER_LIST) \
_(CONNECTION_CREATE_LISTENER_ITERATE) \
_(CONNECTION_CREATE_LISTENER_GET) \
_(CONNECTION_CREATE_LISTENER_VERIFY) \
_(CONNECTION_CREATE_LISTENER_CREATE) \
_(CONNECTION_CREATE_LISTENER_CHECK) \
_(CONNECTION_CREATE) \
_(CONNECTION_CREATE_N) \
_(FACE_CREATE_CONNECTION_CREATE) \
_(FACE_CREATE_CONNECTION_CHECK) \
_(FACE_CREATE_CONNECTION_GET) \
_(FACE_CREATE_CONNECTION_VERIFY) \
_(FACE_CREATE_LISTENER_CREATE) \
_(FACE_CREATE_LISTENER_CHECK) \
_(FACE_LIST_CONNECTION_LIST) \
_(ROUTE_CREATE_FACE_CREATE) \
_(ROUTE_CREATE_FACE_CHECK) \
_(ROUTE_CREATE) \
_(GET_LIST) \
_(COMPLETE) \
_(N)
typedef enum {
#define _(x) REQUEST_STATE_##x,
foreach_request_state
#undef _
} hc_request_state_t;
extern const char *hc_request_state_str[];
#define hc_request_state_str(x) hc_request_state_str[x]
/*
* Internal state associated to a pending request
*/
typedef struct hc_request_s hc_request_t;
hc_request_t *hc_request_create(int seq, hc_action_t action,
hc_object_type_t object_type,
hc_object_t *object,
hc_result_callback_t callback,
void *callback_data);
void hc_request_free(hc_request_t *request);
void hc_request_set(hc_request_t *request, hc_action_t action,
hc_object_type_t object_type, hc_object_t *object);
int hc_request_get_seq(const hc_request_t *request);
hc_request_t *hc_request_get_current(hc_request_t *request);
hc_request_t *hc_request_pop(hc_request_t *request);
hc_request_state_t hc_request_get_state(const hc_request_t *request);
void hc_request_set_state(hc_request_t *request, hc_request_state_t state);
int hc_request_get_state_count(const hc_request_t *request);
void hc_request_set_state_count(hc_request_t *request, unsigned count);
hc_action_t hc_request_get_action(const hc_request_t *request);
hc_object_type_t hc_request_get_object_type(const hc_request_t *request);
hc_object_t *hc_request_get_object(const hc_request_t *request);
hc_data_t *hc_request_get_data(const hc_request_t *request);
void hc_request_set_data(hc_request_t *request, hc_data_t *data);
void hc_request_reset_data(hc_request_t *request);
bool hc_request_is_subscription(const hc_request_t *request);
bool hc_request_requires_object(const hc_request_t *request);
// do not free data which might be invalid
// XXX to be removed if we replace "ensure_data_size_and_free" functions and the
// like, with equivalent functions acting on request
void hc_request_clear_data(hc_request_t *request);
void hc_request_set_complete(hc_request_t *request);
bool hc_request_is_complete(const hc_request_t *request);
void hc_request_on_complete(hc_request_t *request);
void hc_request_on_notification(hc_request_t *request);
/*
* Same seq & callbacks
*/
hc_request_t *hc_request_make_subrequest(hc_request_t *request,
hc_action_t action,
hc_object_type_t object_type,
hc_object_t *object);
#endif /* HC_REQUEST_H */
|