2 * Server side of OSPF API.
3 * Copyright (C) 2001, 2002 Ralph Keller
5 * This file is part of GNU Zebra.
7 * GNU Zebra is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published
9 * by the Free Software Foundation; either version 2, or (at your
10 * option) any later version.
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #ifndef _OSPF_APISERVER_H
23 #define _OSPF_APISERVER_H
25 /* MTYPE definition is not reflected to "memory.h". */
26 #define MTYPE_OSPF_APISERVER MTYPE_TMP
27 #define MTYPE_OSPF_APISERVER_MSGFILTER MTYPE_TMP
29 /* List of opaque types that application registered */
30 struct registered_opaque_type
{
36 /* Server instance for each accepted client connection. */
37 struct ospf_apiserver
{
38 /* Socket connections for synchronous commands and asynchronous
40 int fd_sync
; /* synchronous requests */
41 struct sockaddr_in peer_sync
;
43 int fd_async
; /* asynchronous notifications */
44 struct sockaddr_in peer_async
;
46 /* List of all opaque types that application registers to use. Using
47 a single connection with the OSPF daemon, multiple
48 <lsa,opaque_type> pairs can be registered. However, each
49 combination can only be registered once by all applications. */
50 struct list
*opaque_types
; /* of type registered_opaque_type */
52 /* Temporary storage for LSA instances to be refreshed. */
53 struct ospf_lsdb reserve
;
55 /* filter for LSA update/delete notifies */
56 struct lsa_filter_type
*filter
;
58 /* Fifo buffers for outgoing messages */
59 struct msg_fifo
*out_sync_fifo
;
60 struct msg_fifo
*out_async_fifo
;
62 /* Read and write threads */
63 struct thread
*t_sync_read
;
65 struct thread
*t_async_read
;
66 #endif /* USE_ASYNC_READ */
67 struct thread
*t_sync_write
;
68 struct thread
*t_async_write
;
72 OSPF_APISERVER_ACCEPT
,
73 OSPF_APISERVER_SYNC_READ
,
75 OSPF_APISERVER_ASYNC_READ
,
76 #endif /* USE_ASYNC_READ */
77 OSPF_APISERVER_SYNC_WRITE
,
78 OSPF_APISERVER_ASYNC_WRITE
81 /* -----------------------------------------------------------
82 * Followings are functions to manage client connections.
83 * -----------------------------------------------------------
86 extern unsigned short ospf_apiserver_getport(void);
87 extern int ospf_apiserver_init(void);
88 extern void ospf_apiserver_term(void);
89 extern struct ospf_apiserver
*ospf_apiserver_new(int fd_sync
, int fd_async
);
90 extern void ospf_apiserver_free(struct ospf_apiserver
*apiserv
);
91 extern void ospf_apiserver_event(enum event event
, int fd
,
92 struct ospf_apiserver
*apiserv
);
93 extern int ospf_apiserver_serv_sock_family(unsigned short port
, int family
);
94 extern int ospf_apiserver_accept(struct thread
*thread
);
95 extern int ospf_apiserver_read(struct thread
*thread
);
96 extern int ospf_apiserver_sync_write(struct thread
*thread
);
97 extern int ospf_apiserver_async_write(struct thread
*thread
);
98 extern int ospf_apiserver_send_reply(struct ospf_apiserver
*apiserv
,
99 uint32_t seqnr
, uint8_t rc
);
101 /* -----------------------------------------------------------
102 * Followings are message handler functions
103 * -----------------------------------------------------------
106 extern int ospf_apiserver_lsa9_originator(void *arg
);
107 extern int ospf_apiserver_lsa10_originator(void *arg
);
108 extern int ospf_apiserver_lsa11_originator(void *arg
);
110 extern void ospf_apiserver_clients_notify_all(struct msg
*msg
);
113 ospf_apiserver_clients_notify_ready_type9(struct ospf_interface
*oi
);
114 extern void ospf_apiserver_clients_notify_ready_type10(struct ospf_area
*area
);
115 extern void ospf_apiserver_clients_notify_ready_type11(struct ospf
*top
);
117 extern void ospf_apiserver_clients_notify_new_if(struct ospf_interface
*oi
);
118 extern void ospf_apiserver_clients_notify_del_if(struct ospf_interface
*oi
);
119 extern void ospf_apiserver_clients_notify_ism_change(struct ospf_interface
*oi
);
120 extern void ospf_apiserver_clients_notify_nsm_change(struct ospf_neighbor
*nbr
);
122 extern int ospf_apiserver_is_ready_type9(struct ospf_interface
*oi
);
123 extern int ospf_apiserver_is_ready_type10(struct ospf_area
*area
);
124 extern int ospf_apiserver_is_ready_type11(struct ospf
*ospf
);
126 extern void ospf_apiserver_notify_ready_type9(struct ospf_apiserver
*apiserv
);
127 extern void ospf_apiserver_notify_ready_type10(struct ospf_apiserver
*apiserv
);
128 extern void ospf_apiserver_notify_ready_type11(struct ospf_apiserver
*apiserv
);
130 extern int ospf_apiserver_handle_msg(struct ospf_apiserver
*apiserv
,
133 ospf_apiserver_handle_register_opaque_type(struct ospf_apiserver
*apiserv
,
136 ospf_apiserver_handle_unregister_opaque_type(struct ospf_apiserver
*apiserv
,
138 extern int ospf_apiserver_handle_register_event(struct ospf_apiserver
*apiserv
,
141 ospf_apiserver_handle_originate_request(struct ospf_apiserver
*apiserv
,
143 extern int ospf_apiserver_handle_delete_request(struct ospf_apiserver
*apiserv
,
145 extern int ospf_apiserver_handle_sync_lsdb(struct ospf_apiserver
*apiserv
,
149 /* -----------------------------------------------------------
150 * Followings 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 extern void ospf_apiserver_flood_opaque_lsa(struct ospf_lsa
*lsa
);
171 /* -----------------------------------------------------------
172 * Followings are callback functions to handle opaque types
173 * -----------------------------------------------------------
176 extern int ospf_apiserver_new_if(struct interface
*ifp
);
177 extern int ospf_apiserver_del_if(struct interface
*ifp
);
178 extern void ospf_apiserver_ism_change(struct ospf_interface
*oi
,
180 extern void ospf_apiserver_nsm_change(struct ospf_neighbor
*nbr
,
182 extern void ospf_apiserver_config_write_router(struct vty
*vty
);
183 extern void ospf_apiserver_config_write_if(struct vty
*vty
,
184 struct interface
*ifp
);
185 extern void ospf_apiserver_show_info(struct vty
*vty
, struct json_object
*json
,
186 struct ospf_lsa
*lsa
);
187 extern int ospf_ospf_apiserver_lsa_originator(void *arg
);
188 extern struct ospf_lsa
*ospf_apiserver_lsa_refresher(struct ospf_lsa
*lsa
);
189 extern void ospf_apiserver_flush_opaque_lsa(struct ospf_apiserver
*apiserv
,
191 uint8_t opaque_type
);
193 /* -----------------------------------------------------------
194 * Followings are hooks when LSAs are updated or deleted
195 * -----------------------------------------------------------
199 /* Hooks that are invoked from ospf opaque module */
201 extern int ospf_apiserver_lsa_update(struct ospf_lsa
*lsa
);
202 extern int ospf_apiserver_lsa_delete(struct ospf_lsa
*lsa
);
204 extern void ospf_apiserver_clients_lsa_change_notify(uint8_t msgtype
,
205 struct ospf_lsa
*lsa
);
207 #endif /* _OSPF_APISERVER_H */