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
|
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Server side of OSPF API.
* Copyright (C) 2001, 2002 Ralph Keller
*/
#ifndef _OSPF_APISERVER_H
#define _OSPF_APISERVER_H
#include <zebra.h>
#include "ospf_api.h"
#include "ospf_lsdb.h"
/* List of opaque types that application registered */
struct registered_opaque_type {
uint8_t lsa_type;
uint8_t opaque_type;
};
/* Server instance for each accepted client connection. */
struct ospf_apiserver {
/* Socket connections for synchronous commands and asynchronous
notifications */
int fd_sync; /* synchronous requests */
struct sockaddr_in peer_sync;
int fd_async; /* asynchronous notifications */
struct sockaddr_in peer_async;
/* List of all opaque types that application registers to use. Using
a single connection with the OSPF daemon, multiple
<lsa,opaque_type> pairs can be registered. However, each
combination can only be registered once by all applications. */
struct list *opaque_types; /* of type registered_opaque_type */
/* Temporary storage for LSA instances to be refreshed. */
struct ospf_lsdb reserve;
/* Sync reachable routers */
bool reachable_sync;
/* filter for LSA update/delete notifies */
struct lsa_filter_type *filter;
/* Fifo buffers for outgoing messages */
struct msg_fifo *out_sync_fifo;
struct msg_fifo *out_async_fifo;
/* Read and write threads */
struct thread *t_sync_read;
#ifdef USE_ASYNC_READ
struct thread *t_async_read;
#endif /* USE_ASYNC_READ */
struct thread *t_sync_write;
struct thread *t_async_write;
};
enum ospf_apiserver_event {
OSPF_APISERVER_ACCEPT,
OSPF_APISERVER_SYNC_READ,
#ifdef USE_ASYNC_READ
OSPF_APISERVER_ASYNC_READ,
#endif /* USE_ASYNC_READ */
OSPF_APISERVER_SYNC_WRITE,
OSPF_APISERVER_ASYNC_WRITE
};
/* -----------------------------------------------------------
* Following are functions to manage client connections.
* -----------------------------------------------------------
*/
extern unsigned short ospf_apiserver_getport(void);
extern int ospf_apiserver_init(void);
extern void ospf_apiserver_term(void);
extern struct ospf_apiserver *ospf_apiserver_new(int fd_sync, int fd_async);
extern void ospf_apiserver_free(struct ospf_apiserver *apiserv);
extern void ospf_apiserver_event(enum ospf_apiserver_event event, int fd,
struct ospf_apiserver *apiserv);
extern int ospf_apiserver_serv_sock_family(unsigned short port, int family);
extern void ospf_apiserver_accept(struct thread *thread);
extern void ospf_apiserver_read(struct thread *thread);
extern void ospf_apiserver_sync_write(struct thread *thread);
extern void ospf_apiserver_async_write(struct thread *thread);
extern int ospf_apiserver_send_reply(struct ospf_apiserver *apiserv,
uint32_t seqnr, uint8_t rc);
/* -----------------------------------------------------------
* Following are message handler functions
* -----------------------------------------------------------
*/
extern int ospf_apiserver_lsa9_originator(void *arg);
extern int ospf_apiserver_lsa10_originator(void *arg);
extern int ospf_apiserver_lsa11_originator(void *arg);
extern void ospf_apiserver_clients_notify_all(struct msg *msg);
extern void
ospf_apiserver_clients_notify_ready_type9(struct ospf_interface *oi);
extern void ospf_apiserver_clients_notify_ready_type10(struct ospf_area *area);
extern void ospf_apiserver_clients_notify_ready_type11(struct ospf *top);
extern void ospf_apiserver_clients_notify_new_if(struct ospf_interface *oi);
extern void ospf_apiserver_clients_notify_del_if(struct ospf_interface *oi);
extern void ospf_apiserver_clients_notify_ism_change(struct ospf_interface *oi);
extern void ospf_apiserver_clients_notify_nsm_change(struct ospf_neighbor *nbr);
extern void
ospf_apiserver_clients_notify_router_id_change(struct in_addr router_id);
extern int ospf_apiserver_is_ready_type9(struct ospf_interface *oi);
extern int ospf_apiserver_is_ready_type10(struct ospf_area *area);
extern int ospf_apiserver_is_ready_type11(struct ospf *ospf);
extern void ospf_apiserver_notify_ready_type9(struct ospf_apiserver *apiserv);
extern void ospf_apiserver_notify_ready_type10(struct ospf_apiserver *apiserv);
extern void ospf_apiserver_notify_ready_type11(struct ospf_apiserver *apiserv);
extern int ospf_apiserver_handle_msg(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int
ospf_apiserver_handle_register_opaque_type(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int
ospf_apiserver_handle_unregister_opaque_type(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int ospf_apiserver_handle_register_event(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int
ospf_apiserver_handle_originate_request(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int ospf_apiserver_handle_delete_request(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int ospf_apiserver_handle_sync_lsdb(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int ospf_apiserver_handle_sync_reachable(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int ospf_apiserver_handle_sync_ism(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int ospf_apiserver_handle_sync_nsm(struct ospf_apiserver *apiserv,
struct msg *msg);
extern int ospf_apiserver_handle_sync_router_id(struct ospf_apiserver *apiserv,
struct msg *msg);
extern void ospf_apiserver_notify_reachable(struct route_table *ort,
struct route_table *nrt);
/* -----------------------------------------------------------
* Following are functions for LSA origination/deletion
* -----------------------------------------------------------
*/
extern int ospf_apiserver_register_opaque_type(struct ospf_apiserver *apiserver,
uint8_t lsa_type,
uint8_t opaque_type);
extern int
ospf_apiserver_unregister_opaque_type(struct ospf_apiserver *apiserver,
uint8_t lsa_type, uint8_t opaque_type);
extern struct ospf_lsa *
ospf_apiserver_opaque_lsa_new(struct ospf_area *area, struct ospf_interface *oi,
struct lsa_header *protolsa);
extern struct ospf_interface *
ospf_apiserver_if_lookup_by_addr(struct in_addr address);
extern struct ospf_interface *
ospf_apiserver_if_lookup_by_ifp(struct interface *ifp);
extern int ospf_apiserver_originate1(struct ospf_lsa *lsa,
struct ospf_lsa *old);
extern void ospf_apiserver_flood_opaque_lsa(struct ospf_lsa *lsa);
/* -----------------------------------------------------------
* Following are callback functions to handle opaque types
* -----------------------------------------------------------
*/
extern int ospf_apiserver_new_if(struct interface *ifp);
extern int ospf_apiserver_del_if(struct interface *ifp);
extern void ospf_apiserver_ism_change(struct ospf_interface *oi,
int old_status);
extern void ospf_apiserver_nsm_change(struct ospf_neighbor *nbr,
int old_status);
extern void ospf_apiserver_config_write_router(struct vty *vty);
extern void ospf_apiserver_config_write_if(struct vty *vty,
struct interface *ifp);
extern void ospf_apiserver_show_info(struct vty *vty, struct json_object *json,
struct ospf_lsa *lsa);
extern int ospf_ospf_apiserver_lsa_originator(void *arg);
extern struct ospf_lsa *ospf_apiserver_lsa_refresher(struct ospf_lsa *lsa);
extern void ospf_apiserver_flush_opaque_lsa(struct ospf_apiserver *apiserv,
uint8_t lsa_type,
uint8_t opaque_type);
/* -----------------------------------------------------------
* Following are hooks when LSAs are updated or deleted
* -----------------------------------------------------------
*/
/* Hooks that are invoked from ospf opaque module */
extern int ospf_apiserver_lsa_update(struct ospf_lsa *lsa);
extern int ospf_apiserver_lsa_delete(struct ospf_lsa *lsa);
#endif /* _OSPF_APISERVER_H */
|