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 	uint8_t lsa_type;
32 	uint8_t opaque_type;
33 };
34 
35 
36 /* Server instance for each accepted client connection. */
37 struct ospf_apiserver {
38 	/* Socket connections for synchronous commands and asynchronous
39 	   notifications */
40 	int fd_sync; /* synchronous requests */
41 	struct sockaddr_in peer_sync;
42 
43 	int fd_async; /* asynchronous notifications */
44 	struct sockaddr_in peer_async;
45 
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 */
51 
52 	/* Temporary storage for LSA instances to be refreshed. */
53 	struct ospf_lsdb reserve;
54 
55 	/* filter for LSA update/delete notifies */
56 	struct lsa_filter_type *filter;
57 
58 	/* Fifo buffers for outgoing messages */
59 	struct msg_fifo *out_sync_fifo;
60 	struct msg_fifo *out_async_fifo;
61 
62 	/* Read and write threads */
63 	struct thread *t_sync_read;
64 #ifdef USE_ASYNC_READ
65 	struct thread *t_async_read;
66 #endif /* USE_ASYNC_READ */
67 	struct thread *t_sync_write;
68 	struct thread *t_async_write;
69 };
70 
71 enum event {
72 	OSPF_APISERVER_ACCEPT,
73 	OSPF_APISERVER_SYNC_READ,
74 #ifdef USE_ASYNC_READ
75 	OSPF_APISERVER_ASYNC_READ,
76 #endif /* USE_ASYNC_READ */
77 	OSPF_APISERVER_SYNC_WRITE,
78 	OSPF_APISERVER_ASYNC_WRITE
79 };
80 
81 /* -----------------------------------------------------------
82  * Followings are functions to manage client connections.
83  * -----------------------------------------------------------
84  */
85 
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);
100 
101 /* -----------------------------------------------------------
102  * Followings are message handler functions
103  * -----------------------------------------------------------
104  */
105 
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);
109 
110 extern void ospf_apiserver_clients_notify_all(struct msg *msg);
111 
112 extern void
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);
116 
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);
121 
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);
125 
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);
129 
130 extern int ospf_apiserver_handle_msg(struct ospf_apiserver *apiserv,
131 				     struct msg *msg);
132 extern int
133 ospf_apiserver_handle_register_opaque_type(struct ospf_apiserver *apiserv,
134 					   struct msg *msg);
135 extern int
136 ospf_apiserver_handle_unregister_opaque_type(struct ospf_apiserver *apiserv,
137 					     struct msg *msg);
138 extern int ospf_apiserver_handle_register_event(struct ospf_apiserver *apiserv,
139 						struct msg *msg);
140 extern int
141 ospf_apiserver_handle_originate_request(struct ospf_apiserver *apiserv,
142 					struct msg *msg);
143 extern int ospf_apiserver_handle_delete_request(struct ospf_apiserver *apiserv,
144 						struct msg *msg);
145 extern int ospf_apiserver_handle_sync_lsdb(struct ospf_apiserver *apiserv,
146 					   struct msg *msg);
147 
148 
149 /* -----------------------------------------------------------
150  * Followings are functions for LSA origination/deletion
151  * -----------------------------------------------------------
152  */
153 
154 extern int ospf_apiserver_register_opaque_type(struct ospf_apiserver *apiserver,
155 					       uint8_t lsa_type,
156 					       uint8_t opaque_type);
157 extern int
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);
169 
170 
171 /* -----------------------------------------------------------
172  * Followings are callback functions to handle opaque types
173  * -----------------------------------------------------------
174  */
175 
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,
179 				      int old_status);
180 extern void ospf_apiserver_nsm_change(struct ospf_neighbor *nbr,
181 				      int old_status);
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 ospf_lsa *lsa);
186 extern int ospf_ospf_apiserver_lsa_originator(void *arg);
187 extern struct ospf_lsa *ospf_apiserver_lsa_refresher(struct ospf_lsa *lsa);
188 extern void ospf_apiserver_flush_opaque_lsa(struct ospf_apiserver *apiserv,
189 					    uint8_t lsa_type,
190 					    uint8_t opaque_type);
191 
192 /* -----------------------------------------------------------
193  * Followings are hooks when LSAs are updated or deleted
194  * -----------------------------------------------------------
195  */
196 
197 
198 /* Hooks that are invoked from ospf opaque module */
199 
200 extern int ospf_apiserver_lsa_update(struct ospf_lsa *lsa);
201 extern int ospf_apiserver_lsa_delete(struct ospf_lsa *lsa);
202 
203 extern void ospf_apiserver_clients_lsa_change_notify(uint8_t msgtype,
204 						     struct ospf_lsa *lsa);
205 
206 #endif /* _OSPF_APISERVER_H */
207