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
37 /* Server instance for each accepted client connection. */
40 /* Socket connections for synchronous commands and asynchronous
42 int fd_sync
; /* synchronous requests */
43 struct sockaddr_in peer_sync
;
45 int fd_async
; /* asynchronous notifications */
46 struct sockaddr_in peer_async
;
48 /* List of all opaque types that application registers to use. Using
49 a single connection with the OSPF daemon, multiple
50 <lsa,opaque_type> pairs can be registered. However, each
51 combination can only be registered once by all applications. */
52 struct list
*opaque_types
; /* of type registered_opaque_type */
54 /* Temporary storage for LSA instances to be refreshed. */
55 struct ospf_lsdb reserve
;
57 /* filter for LSA update/delete notifies */
58 struct lsa_filter_type
*filter
;
60 /* Fifo buffers for outgoing messages */
61 struct msg_fifo
*out_sync_fifo
;
62 struct msg_fifo
*out_async_fifo
;
64 /* Read and write threads */
65 struct thread
*t_sync_read
;
67 struct thread
*t_async_read
;
68 #endif /* USE_ASYNC_READ */
69 struct thread
*t_sync_write
;
70 struct thread
*t_async_write
;
75 OSPF_APISERVER_ACCEPT
,
76 OSPF_APISERVER_SYNC_READ
,
78 OSPF_APISERVER_ASYNC_READ
,
79 #endif /* USE_ASYNC_READ */
80 OSPF_APISERVER_SYNC_WRITE
,
81 OSPF_APISERVER_ASYNC_WRITE
84 /* -----------------------------------------------------------
85 * Followings are functions to manage client connections.
86 * -----------------------------------------------------------
89 extern unsigned short ospf_apiserver_getport (void);
90 extern int ospf_apiserver_init (void);
91 extern void ospf_apiserver_term (void);
92 extern struct ospf_apiserver
*ospf_apiserver_new (int fd_sync
, int fd_async
);
93 extern void ospf_apiserver_free (struct ospf_apiserver
*apiserv
);
94 extern void ospf_apiserver_event (enum event event
, int fd
,
95 struct ospf_apiserver
*apiserv
);
96 extern int ospf_apiserver_serv_sock_family (unsigned short port
, int family
);
97 extern int ospf_apiserver_accept (struct thread
*thread
);
98 extern int ospf_apiserver_read (struct thread
*thread
);
99 extern int ospf_apiserver_sync_write (struct thread
*thread
);
100 extern int ospf_apiserver_async_write (struct thread
*thread
);
101 extern int ospf_apiserver_send_reply (struct ospf_apiserver
*apiserv
,
102 u_int32_t seqnr
, u_char rc
);
104 /* -----------------------------------------------------------
105 * Followings are message handler functions
106 * -----------------------------------------------------------
109 extern int ospf_apiserver_lsa9_originator (void *arg
);
110 extern int ospf_apiserver_lsa10_originator (void *arg
);
111 extern int ospf_apiserver_lsa11_originator (void *arg
);
113 extern void ospf_apiserver_clients_notify_all (struct msg
*msg
);
115 extern void ospf_apiserver_clients_notify_ready_type9 (struct ospf_interface
*oi
);
116 extern void ospf_apiserver_clients_notify_ready_type10 (struct ospf_area
*area
);
117 extern void ospf_apiserver_clients_notify_ready_type11 (struct ospf
*top
);
119 extern void ospf_apiserver_clients_notify_new_if (struct ospf_interface
*oi
);
120 extern void ospf_apiserver_clients_notify_del_if (struct ospf_interface
*oi
);
121 extern void ospf_apiserver_clients_notify_ism_change (struct ospf_interface
*oi
);
122 extern void ospf_apiserver_clients_notify_nsm_change (struct ospf_neighbor
*nbr
);
124 extern int ospf_apiserver_is_ready_type9 (struct ospf_interface
*oi
);
125 extern int ospf_apiserver_is_ready_type10 (struct ospf_area
*area
);
126 extern int ospf_apiserver_is_ready_type11 (struct ospf
*ospf
);
128 extern void ospf_apiserver_notify_ready_type9 (struct ospf_apiserver
*apiserv
);
129 extern void ospf_apiserver_notify_ready_type10 (struct ospf_apiserver
*apiserv
);
130 extern void ospf_apiserver_notify_ready_type11 (struct ospf_apiserver
*apiserv
);
132 extern int ospf_apiserver_handle_msg (struct ospf_apiserver
*apiserv
,
134 extern int ospf_apiserver_handle_register_opaque_type (struct ospf_apiserver
135 *apiserv
, struct msg
*msg
);
136 extern int ospf_apiserver_handle_unregister_opaque_type (struct ospf_apiserver
137 *apiserv
, struct msg
*msg
);
138 extern int ospf_apiserver_handle_register_event (struct ospf_apiserver
*apiserv
,
140 extern int ospf_apiserver_handle_originate_request (struct ospf_apiserver
*apiserv
,
142 extern int ospf_apiserver_handle_delete_request (struct ospf_apiserver
*apiserv
,
144 extern int ospf_apiserver_handle_sync_lsdb (struct ospf_apiserver
*apiserv
,
148 /* -----------------------------------------------------------
149 * Followings are functions for LSA origination/deletion
150 * -----------------------------------------------------------
153 extern int ospf_apiserver_register_opaque_type (struct ospf_apiserver
*apiserver
,
154 u_char lsa_type
, u_char opaque_type
);
155 extern int ospf_apiserver_unregister_opaque_type (struct ospf_apiserver
*apiserver
,
158 extern struct ospf_lsa
*ospf_apiserver_opaque_lsa_new (struct ospf_area
*area
,
159 struct ospf_interface
*oi
,
160 struct lsa_header
*protolsa
);
161 extern struct ospf_interface
*ospf_apiserver_if_lookup_by_addr (struct in_addr
163 extern struct ospf_interface
*ospf_apiserver_if_lookup_by_ifp (struct interface
165 extern int ospf_apiserver_originate1 (struct ospf_lsa
*lsa
);
166 extern void ospf_apiserver_flood_opaque_lsa (struct ospf_lsa
*lsa
);
169 /* -----------------------------------------------------------
170 * Followings are callback functions to handle opaque types
171 * -----------------------------------------------------------
174 extern int ospf_apiserver_new_if (struct interface
*ifp
);
175 extern int ospf_apiserver_del_if (struct interface
*ifp
);
176 extern void ospf_apiserver_ism_change (struct ospf_interface
*oi
, int old_status
);
177 extern void ospf_apiserver_nsm_change (struct ospf_neighbor
*nbr
, int old_status
);
178 extern void ospf_apiserver_config_write_router (struct vty
*vty
);
179 extern void ospf_apiserver_config_write_if (struct vty
*vty
, struct interface
*ifp
);
180 extern void ospf_apiserver_show_info (struct vty
*vty
, struct ospf_lsa
*lsa
);
181 extern int ospf_ospf_apiserver_lsa_originator (void *arg
);
182 extern struct ospf_lsa
*ospf_apiserver_lsa_refresher (struct ospf_lsa
*lsa
);
183 extern void ospf_apiserver_flush_opaque_lsa (struct ospf_apiserver
*apiserv
,
184 u_char lsa_type
, u_char opaque_type
);
186 /* -----------------------------------------------------------
187 * Followings are hooks when LSAs are updated or deleted
188 * -----------------------------------------------------------
192 /* Hooks that are invoked from ospf opaque module */
194 extern int ospf_apiserver_lsa_update (struct ospf_lsa
*lsa
);
195 extern int ospf_apiserver_lsa_delete (struct ospf_lsa
*lsa
);
197 extern void ospf_apiserver_clients_lsa_change_notify (u_char msgtype
,
198 struct ospf_lsa
*lsa
);
200 #endif /* _OSPF_APISERVER_H */