1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Server side of OSPF API.
4 * Copyright (C) 2001, 2002 Ralph Keller
7 #ifndef _OSPF_APISERVER_H
8 #define _OSPF_APISERVER_H
12 #include "ospf_lsdb.h"
14 /* List of opaque types that application registered */
15 struct registered_opaque_type
{
21 /* Server instance for each accepted client connection. */
22 struct ospf_apiserver
{
23 /* Socket connections for synchronous commands and asynchronous
25 int fd_sync
; /* synchronous requests */
26 struct sockaddr_in peer_sync
;
28 int fd_async
; /* asynchronous notifications */
29 struct sockaddr_in peer_async
;
31 /* List of all opaque types that application registers to use. Using
32 a single connection with the OSPF daemon, multiple
33 <lsa,opaque_type> pairs can be registered. However, each
34 combination can only be registered once by all applications. */
35 struct list
*opaque_types
; /* of type registered_opaque_type */
37 /* Temporary storage for LSA instances to be refreshed. */
38 struct ospf_lsdb reserve
;
40 /* Sync reachable routers */
43 /* filter for LSA update/delete notifies */
44 struct lsa_filter_type
*filter
;
46 /* Fifo buffers for outgoing messages */
47 struct msg_fifo
*out_sync_fifo
;
48 struct msg_fifo
*out_async_fifo
;
50 /* Read and write threads */
51 struct event
*t_sync_read
;
53 struct event
*t_async_read
;
54 #endif /* USE_ASYNC_READ */
55 struct event
*t_sync_write
;
56 struct event
*t_async_write
;
59 enum ospf_apiserver_event
{
60 OSPF_APISERVER_ACCEPT
,
61 OSPF_APISERVER_SYNC_READ
,
63 OSPF_APISERVER_ASYNC_READ
,
64 #endif /* USE_ASYNC_READ */
65 OSPF_APISERVER_SYNC_WRITE
,
66 OSPF_APISERVER_ASYNC_WRITE
69 /* -----------------------------------------------------------
70 * Following are functions to manage client connections.
71 * -----------------------------------------------------------
74 extern unsigned short ospf_apiserver_getport(void);
75 extern int ospf_apiserver_init(void);
76 extern void ospf_apiserver_term(void);
77 extern struct ospf_apiserver
*ospf_apiserver_new(int fd_sync
, int fd_async
);
78 extern void ospf_apiserver_free(struct ospf_apiserver
*apiserv
);
79 extern void ospf_apiserver_event(enum ospf_apiserver_event event
, int fd
,
80 struct ospf_apiserver
*apiserv
);
81 extern int ospf_apiserver_serv_sock_family(unsigned short port
, int family
);
82 extern void ospf_apiserver_accept(struct event
*thread
);
83 extern void ospf_apiserver_read(struct event
*thread
);
84 extern void ospf_apiserver_sync_write(struct event
*thread
);
85 extern void ospf_apiserver_async_write(struct event
*thread
);
86 extern int ospf_apiserver_send_reply(struct ospf_apiserver
*apiserv
,
87 uint32_t seqnr
, uint8_t rc
);
89 /* -----------------------------------------------------------
90 * Following are message handler functions
91 * -----------------------------------------------------------
94 extern int ospf_apiserver_lsa9_originator(void *arg
);
95 extern int ospf_apiserver_lsa10_originator(void *arg
);
96 extern int ospf_apiserver_lsa11_originator(void *arg
);
98 extern void ospf_apiserver_clients_notify_all(struct msg
*msg
);
101 ospf_apiserver_clients_notify_ready_type9(struct ospf_interface
*oi
);
102 extern void ospf_apiserver_clients_notify_ready_type10(struct ospf_area
*area
);
103 extern void ospf_apiserver_clients_notify_ready_type11(struct ospf
*top
);
105 extern void ospf_apiserver_clients_notify_new_if(struct ospf_interface
*oi
);
106 extern void ospf_apiserver_clients_notify_del_if(struct ospf_interface
*oi
);
107 extern void ospf_apiserver_clients_notify_ism_change(struct ospf_interface
*oi
);
108 extern void ospf_apiserver_clients_notify_nsm_change(struct ospf_neighbor
*nbr
);
110 ospf_apiserver_clients_notify_router_id_change(struct in_addr router_id
);
112 extern int ospf_apiserver_is_ready_type9(struct ospf_interface
*oi
);
113 extern int ospf_apiserver_is_ready_type10(struct ospf_area
*area
);
114 extern int ospf_apiserver_is_ready_type11(struct ospf
*ospf
);
116 extern void ospf_apiserver_notify_ready_type9(struct ospf_apiserver
*apiserv
);
117 extern void ospf_apiserver_notify_ready_type10(struct ospf_apiserver
*apiserv
);
118 extern void ospf_apiserver_notify_ready_type11(struct ospf_apiserver
*apiserv
);
120 extern int ospf_apiserver_handle_msg(struct ospf_apiserver
*apiserv
,
123 ospf_apiserver_handle_register_opaque_type(struct ospf_apiserver
*apiserv
,
126 ospf_apiserver_handle_unregister_opaque_type(struct ospf_apiserver
*apiserv
,
128 extern int ospf_apiserver_handle_register_event(struct ospf_apiserver
*apiserv
,
131 ospf_apiserver_handle_originate_request(struct ospf_apiserver
*apiserv
,
133 extern int ospf_apiserver_handle_delete_request(struct ospf_apiserver
*apiserv
,
135 extern int ospf_apiserver_handle_sync_lsdb(struct ospf_apiserver
*apiserv
,
137 extern int ospf_apiserver_handle_sync_reachable(struct ospf_apiserver
*apiserv
,
139 extern int ospf_apiserver_handle_sync_ism(struct ospf_apiserver
*apiserv
,
141 extern int ospf_apiserver_handle_sync_nsm(struct ospf_apiserver
*apiserv
,
143 extern int ospf_apiserver_handle_sync_router_id(struct ospf_apiserver
*apiserv
,
146 extern void ospf_apiserver_notify_reachable(struct route_table
*ort
,
147 struct route_table
*nrt
);
149 /* -----------------------------------------------------------
150 * Following are functions for LSA origination/deletion
151 * -----------------------------------------------------------
154 extern int ospf_apiserver_register_opaque_type(struct ospf_apiserver
*apiserver
,
156 uint8_t opaque_type
);
158 ospf_apiserver_unregister_opaque_type(struct ospf_apiserver
*apiserver
,
159 uint8_t lsa_type
, uint8_t opaque_type
);
160 extern struct ospf_lsa
*
161 ospf_apiserver_opaque_lsa_new(struct ospf_area
*area
, struct ospf_interface
*oi
,
162 struct lsa_header
*protolsa
);
163 extern struct ospf_interface
*
164 ospf_apiserver_if_lookup_by_addr(struct in_addr address
);
165 extern struct ospf_interface
*
166 ospf_apiserver_if_lookup_by_ifp(struct interface
*ifp
);
167 extern int ospf_apiserver_originate1(struct ospf_lsa
*lsa
,
168 struct ospf_lsa
*old
);
169 extern void ospf_apiserver_flood_opaque_lsa(struct ospf_lsa
*lsa
);
172 /* -----------------------------------------------------------
173 * Following are callback functions to handle opaque types
174 * -----------------------------------------------------------
177 extern int ospf_apiserver_new_if(struct interface
*ifp
);
178 extern int ospf_apiserver_del_if(struct interface
*ifp
);
179 extern void ospf_apiserver_ism_change(struct ospf_interface
*oi
,
181 extern void ospf_apiserver_nsm_change(struct ospf_neighbor
*nbr
,
183 extern void ospf_apiserver_config_write_router(struct vty
*vty
);
184 extern void ospf_apiserver_config_write_if(struct vty
*vty
,
185 struct interface
*ifp
);
186 extern void ospf_apiserver_show_info(struct vty
*vty
, struct json_object
*json
,
187 struct ospf_lsa
*lsa
);
188 extern int ospf_ospf_apiserver_lsa_originator(void *arg
);
189 extern struct ospf_lsa
*ospf_apiserver_lsa_refresher(struct ospf_lsa
*lsa
);
190 extern void ospf_apiserver_flush_opaque_lsa(struct ospf_apiserver
*apiserv
,
192 uint8_t opaque_type
);
194 /* -----------------------------------------------------------
195 * Following are hooks when LSAs are updated or deleted
196 * -----------------------------------------------------------
200 /* Hooks that are invoked from ospf opaque module */
202 extern int ospf_apiserver_lsa_update(struct ospf_lsa
*lsa
);
203 extern int ospf_apiserver_lsa_delete(struct ospf_lsa
*lsa
);
205 #endif /* _OSPF_APISERVER_H */