summaryrefslogtreecommitdiffstats
path: root/mgmtd/mgmt_be_adapter.h
blob: 88d54a7842ed22b62e5c474f48ba5c2d2fbaac6c (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
217
218
219
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * MGMTD Backend Client Connection Adapter
 *
 * Copyright (C) 2021  Vmware, Inc.
 *		       Pushpasis Sarkar <spushpasis@vmware.com>
 */

#ifndef _FRR_MGMTD_BE_ADAPTER_H_
#define _FRR_MGMTD_BE_ADAPTER_H_

#include "mgmt_be_client.h"
#include "mgmt_msg.h"
#include "mgmtd/mgmt_defines.h"
#include "mgmtd/mgmt_ds.h"

#define MGMTD_BE_CONN_INIT_DELAY_MSEC 50

#define MGMTD_FIND_ADAPTER_BY_INDEX(adapter_index)                             \
	mgmt_adaptr_ref[adapter_index]

enum mgmt_be_req_type {
	MGMTD_BE_REQ_NONE = 0,
	MGMTD_BE_REQ_CFG_VALIDATE,
	MGMTD_BE_REQ_CFG_APPLY,
	MGMTD_BE_REQ_DATA_GET_ELEM,
	MGMTD_BE_REQ_DATA_GET_NEXT
};

struct mgmt_be_cfgreq {
	Mgmtd__YangCfgDataReq **cfgdata_reqs;
	size_t num_reqs;
};

struct mgmt_be_datareq {
	Mgmtd__YangGetDataReq **getdata_reqs;
	size_t num_reqs;
};

PREDECL_LIST(mgmt_be_adapters);
PREDECL_LIST(mgmt_txn_badapters);

struct mgmt_be_client_adapter {
	enum mgmt_be_client_id id;
	int conn_fd;
	union sockunion conn_su;
	struct event *conn_init_ev;
	struct event *conn_read_ev;
	struct event *conn_write_ev;
	struct event *conn_writes_on;
	struct event *proc_msg_ev;
	uint32_t flags;
	char name[MGMTD_CLIENT_NAME_MAX_LEN];
	uint8_t num_xpath_reg;
	char xpath_reg[MGMTD_MAX_NUM_XPATH_REG][MGMTD_MAX_XPATH_LEN];

	/* IO streams for read and write */
	struct mgmt_msg_state mstate;

	int refcount;

	/*
	 * List of config items that should be sent to the
	 * backend during re/connect. This is temporarily
	 * created and then freed-up as soon as the initial
	 * config items has been applied onto the backend.
	 */
	struct nb_config_cbs cfg_chgs;

	struct mgmt_be_adapters_item list_linkage;
	struct mgmt_txn_badapters_item txn_list_linkage;
};

#define MGMTD_BE_ADAPTER_FLAGS_WRITES_OFF (1U << 0)
#define MGMTD_BE_ADAPTER_FLAGS_CFG_SYNCED (1U << 1)

DECLARE_LIST(mgmt_be_adapters, struct mgmt_be_client_adapter, list_linkage);
DECLARE_LIST(mgmt_txn_badapters, struct mgmt_be_client_adapter,
	     txn_list_linkage);

union mgmt_be_xpath_subscr_info {
	uint8_t subscribed;
	struct {
		uint8_t validate_config : 1;
		uint8_t notify_config : 1;
		uint8_t own_oper_data : 1;
	};
};

struct mgmt_be_client_subscr_info {
	union mgmt_be_xpath_subscr_info xpath_subscr[MGMTD_BE_CLIENT_ID_MAX];
};

/* Initialise backend adapter module. */
extern int mgmt_be_adapter_init(struct event_loop *tm);

/* Destroy the backend adapter module. */
extern void mgmt_be_adapter_destroy(void);

/* Acquire lock for backend adapter. */
extern void mgmt_be_adapter_lock(struct mgmt_be_client_adapter *adapter);

/* Remove lock from backend adapter. */
extern void mgmt_be_adapter_unlock(struct mgmt_be_client_adapter **adapter);

/* Create backend adapter. */
extern struct mgmt_be_client_adapter *
mgmt_be_create_adapter(int conn_fd, union sockunion *su);

/* Fetch backend adapter given an adapter name. */
extern struct mgmt_be_client_adapter *
mgmt_be_get_adapter_by_name(const char *name);

/* Fetch backend adapter given an client ID. */
extern struct mgmt_be_client_adapter *
mgmt_be_get_adapter_by_id(enum mgmt_be_client_id id);

/* Fetch backend adapter config. */
extern int
mgmt_be_get_adapter_config(struct mgmt_be_client_adapter *adapter,
			      struct mgmt_ds_ctx *ds_ctx,
			      struct nb_config_cbs **cfg_chgs);

/* Create a transaction. */
extern int mgmt_be_create_txn(struct mgmt_be_client_adapter *adapter,
				  uint64_t txn_id);

/* Destroy a transaction. */
extern int mgmt_be_destroy_txn(struct mgmt_be_client_adapter *adapter,
				   uint64_t txn_id);

/*
 * Send config data create request to backend client.
 *
 * adaptr
 *    Backend adapter information.
 *
 * txn_id
 *    Unique transaction identifier.
 *
 * batch_id
 *    Request batch ID.
 *
 * cfg_req
 *    Config data request.
 *
 * end_of_data
 *    TRUE if the data from last batch, FALSE otherwise.
 *
 * Returns:
 *    0 on success, -1 on failure.
 */
extern int mgmt_be_send_cfg_data_create_req(
	struct mgmt_be_client_adapter *adapter, uint64_t txn_id,
	uint64_t batch_id, struct mgmt_be_cfgreq *cfg_req, bool end_of_data);

/*
 * Send config validate request to backend client.
 *
 * adaptr
 *    Backend adapter information.
 *
 * txn_id
 *    Unique transaction identifier.
 *
 * batch_ids
 *    List of request batch IDs.
 *
 * num_batch_ids
 *    Number of batch ids.
 *
 * Returns:
 *    0 on success, -1 on failure.
 */
extern int
mgmt_be_send_cfg_validate_req(struct mgmt_be_client_adapter *adapter,
				 uint64_t txn_id, uint64_t batch_ids[],
				 size_t num_batch_ids);

/*
 * Send config apply request to backend client.
 *
 * adaptr
 *    Backend adapter information.
 *
 * txn_id
 *    Unique transaction identifier.
 *
 * Returns:
 *    0 on success, -1 on failure.
 */
extern int
mgmt_be_send_cfg_apply_req(struct mgmt_be_client_adapter *adapter,
			      uint64_t txn_id);

/*
 * Dump backend adapter status to vty.
 */
extern void mgmt_be_adapter_status_write(struct vty *vty);

/*
 * Dump xpath registry for each backend client to vty.
 */
extern void mgmt_be_xpath_register_write(struct vty *vty);

/*
 * Maps a YANG dtata Xpath to one or more
 * backend clients that should be contacted for various purposes.
 */
extern int mgmt_be_get_subscr_info_for_xpath(
	const char *xpath, struct mgmt_be_client_subscr_info *subscr_info);

/*
 * Dump backend client information for a given xpath to vty.
 */
extern void mgmt_be_xpath_subscr_info_write(struct vty *vty,
					       const char *xpath);

#endif /* _FRR_MGMTD_BE_ADAPTER_H_ */