]> git.proxmox.com Git - mirror_frr.git/blob - ospfd/ospf_apiserver.h
Merge pull request #538 from qlyoung/fix-stack-access-2
[mirror_frr.git] / ospfd / ospf_apiserver.h
1 /*
2 * Server side of OSPF API.
3 * Copyright (C) 2001, 2002 Ralph Keller
4 *
5 * This file is part of GNU Zebra.
6 *
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.
11 *
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.
16 *
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
20 */
21
22 #ifndef _OSPF_APISERVER_H
23 #define _OSPF_APISERVER_H
24
25 /* MTYPE definition is not reflected to "memory.h". */
26 #define MTYPE_OSPF_APISERVER MTYPE_TMP
27 #define MTYPE_OSPF_APISERVER_MSGFILTER MTYPE_TMP
28
29 /* List of opaque types that application registered */
30 struct registered_opaque_type
31 {
32 u_char lsa_type;
33 u_char opaque_type;
34 };
35
36
37 /* Server instance for each accepted client connection. */
38 struct ospf_apiserver
39 {
40 /* Socket connections for synchronous commands and asynchronous
41 notifications */
42 int fd_sync; /* synchronous requests */
43 struct sockaddr_in peer_sync;
44
45 int fd_async; /* asynchronous notifications */
46 struct sockaddr_in peer_async;
47
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 */
53
54 /* Temporary storage for LSA instances to be refreshed. */
55 struct ospf_lsdb reserve;
56
57 /* filter for LSA update/delete notifies */
58 struct lsa_filter_type *filter;
59
60 /* Fifo buffers for outgoing messages */
61 struct msg_fifo *out_sync_fifo;
62 struct msg_fifo *out_async_fifo;
63
64 /* Read and write threads */
65 struct thread *t_sync_read;
66 #ifdef USE_ASYNC_READ
67 struct thread *t_async_read;
68 #endif /* USE_ASYNC_READ */
69 struct thread *t_sync_write;
70 struct thread *t_async_write;
71 };
72
73 enum event
74 {
75 OSPF_APISERVER_ACCEPT,
76 OSPF_APISERVER_SYNC_READ,
77 #ifdef USE_ASYNC_READ
78 OSPF_APISERVER_ASYNC_READ,
79 #endif /* USE_ASYNC_READ */
80 OSPF_APISERVER_SYNC_WRITE,
81 OSPF_APISERVER_ASYNC_WRITE
82 };
83
84 /* -----------------------------------------------------------
85 * Followings are functions to manage client connections.
86 * -----------------------------------------------------------
87 */
88
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);
103
104 /* -----------------------------------------------------------
105 * Followings are message handler functions
106 * -----------------------------------------------------------
107 */
108
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);
112
113 extern void ospf_apiserver_clients_notify_all (struct msg *msg);
114
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);
118
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);
123
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);
127
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);
131
132 extern int ospf_apiserver_handle_msg (struct ospf_apiserver *apiserv,
133 struct msg *msg);
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,
139 struct msg *msg);
140 extern int ospf_apiserver_handle_originate_request (struct ospf_apiserver *apiserv,
141 struct msg *msg);
142 extern int ospf_apiserver_handle_delete_request (struct ospf_apiserver *apiserv,
143 struct msg *msg);
144 extern int ospf_apiserver_handle_sync_lsdb (struct ospf_apiserver *apiserv,
145 struct msg *msg);
146
147
148 /* -----------------------------------------------------------
149 * Followings are functions for LSA origination/deletion
150 * -----------------------------------------------------------
151 */
152
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,
156 u_char lsa_type,
157 u_char opaque_type);
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
162 address);
163 extern struct ospf_interface *ospf_apiserver_if_lookup_by_ifp (struct interface
164 *ifp);
165 extern int ospf_apiserver_originate1 (struct ospf_lsa *lsa);
166 extern void ospf_apiserver_flood_opaque_lsa (struct ospf_lsa *lsa);
167
168
169 /* -----------------------------------------------------------
170 * Followings are callback functions to handle opaque types
171 * -----------------------------------------------------------
172 */
173
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);
185
186 /* -----------------------------------------------------------
187 * Followings are hooks when LSAs are updated or deleted
188 * -----------------------------------------------------------
189 */
190
191
192 /* Hooks that are invoked from ospf opaque module */
193
194 extern int ospf_apiserver_lsa_update (struct ospf_lsa *lsa);
195 extern int ospf_apiserver_lsa_delete (struct ospf_lsa *lsa);
196
197 extern void ospf_apiserver_clients_lsa_change_notify (u_char msgtype,
198 struct ospf_lsa *lsa);
199
200 #endif /* _OSPF_APISERVER_H */