Import Upstream version 1.2.2
[quagga-debian.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
18  * along with GNU Zebra; see the file COPYING.  If not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 #ifndef _OSPF_APISERVER_H
24 #define _OSPF_APISERVER_H
25
26 /* MTYPE definition is not reflected to "memory.h". */
27 #define MTYPE_OSPF_APISERVER MTYPE_TMP
28 #define MTYPE_OSPF_APISERVER_MSGFILTER MTYPE_TMP
29
30 /* List of opaque types that application registered */
31 struct registered_opaque_type
32 {
33   u_char lsa_type;
34   u_char opaque_type;
35 };
36
37
38 /* Server instance for each accepted client connection. */
39 struct ospf_apiserver
40 {
41   /* Socket connections for synchronous commands and asynchronous
42      notifications */
43   int fd_sync;                  /* synchronous requests */
44   struct sockaddr_in peer_sync;
45
46   int fd_async;                 /* asynchronous notifications */
47   struct sockaddr_in peer_async;
48
49   /* List of all opaque types that application registers to use. Using
50      a single connection with the OSPF daemon, multiple
51      <lsa,opaque_type> pairs can be registered. However, each
52      combination can only be registered once by all applications. */
53   struct list *opaque_types;            /* of type registered_opaque_type */
54
55   /* Temporary storage for LSA instances to be refreshed. */
56   struct ospf_lsdb reserve;
57
58   /* filter for LSA update/delete notifies */
59   struct lsa_filter_type *filter;
60
61   /* Fifo buffers for outgoing messages */
62   struct msg_fifo *out_sync_fifo;
63   struct msg_fifo *out_async_fifo;
64
65   /* Read and write threads */
66   struct thread *t_sync_read;
67 #ifdef USE_ASYNC_READ
68   struct thread *t_async_read;
69 #endif /* USE_ASYNC_READ */
70   struct thread *t_sync_write;
71   struct thread *t_async_write;
72 };
73
74 enum event
75 {
76   OSPF_APISERVER_ACCEPT,
77   OSPF_APISERVER_SYNC_READ,
78 #ifdef USE_ASYNC_READ
79   OSPF_APISERVER_ASYNC_READ,
80 #endif /* USE_ASYNC_READ */
81   OSPF_APISERVER_SYNC_WRITE,
82   OSPF_APISERVER_ASYNC_WRITE
83 };
84
85 /* -----------------------------------------------------------
86  * Followings are functions to manage client connections.
87  * -----------------------------------------------------------
88  */
89
90 extern unsigned short ospf_apiserver_getport (void);
91 extern int ospf_apiserver_init (void);
92 extern void ospf_apiserver_term (void);
93 extern struct ospf_apiserver *ospf_apiserver_new (int fd_sync, int fd_async);
94 extern void ospf_apiserver_free (struct ospf_apiserver *apiserv);
95 extern void ospf_apiserver_event (enum event event, int fd,
96                            struct ospf_apiserver *apiserv);
97 extern int ospf_apiserver_serv_sock_family (unsigned short port, int family);
98 extern int ospf_apiserver_accept (struct thread *thread);
99 extern int ospf_apiserver_read (struct thread *thread);
100 extern int ospf_apiserver_sync_write (struct thread *thread);
101 extern int ospf_apiserver_async_write (struct thread *thread);
102 extern int ospf_apiserver_send_reply (struct ospf_apiserver *apiserv,
103                                u_int32_t seqnr, u_char rc);
104
105 /* -----------------------------------------------------------
106  * Followings are message handler functions
107  * -----------------------------------------------------------
108  */
109
110 extern int ospf_apiserver_lsa9_originator (void *arg);
111 extern int ospf_apiserver_lsa10_originator (void *arg);
112 extern int ospf_apiserver_lsa11_originator (void *arg);
113
114 extern void ospf_apiserver_clients_notify_all (struct msg *msg);
115
116 extern void ospf_apiserver_clients_notify_ready_type9 (struct ospf_interface *oi);
117 extern void ospf_apiserver_clients_notify_ready_type10 (struct ospf_area *area);
118 extern void ospf_apiserver_clients_notify_ready_type11 (struct ospf *top);
119
120 extern void ospf_apiserver_clients_notify_new_if (struct ospf_interface *oi);
121 extern void ospf_apiserver_clients_notify_del_if (struct ospf_interface *oi);
122 extern void ospf_apiserver_clients_notify_ism_change (struct ospf_interface *oi);
123 extern void ospf_apiserver_clients_notify_nsm_change (struct ospf_neighbor *nbr);
124
125 extern int ospf_apiserver_is_ready_type9 (struct ospf_interface *oi);
126 extern int ospf_apiserver_is_ready_type10 (struct ospf_area *area);
127 extern int ospf_apiserver_is_ready_type11 (struct ospf *ospf);
128
129 extern void ospf_apiserver_notify_ready_type9 (struct ospf_apiserver *apiserv);
130 extern void ospf_apiserver_notify_ready_type10 (struct ospf_apiserver *apiserv);
131 extern void ospf_apiserver_notify_ready_type11 (struct ospf_apiserver *apiserv);
132
133 extern int ospf_apiserver_handle_msg (struct ospf_apiserver *apiserv,
134                                struct msg *msg);
135 extern int ospf_apiserver_handle_register_opaque_type (struct ospf_apiserver
136                                                 *apiserv, struct msg *msg);
137 extern int ospf_apiserver_handle_unregister_opaque_type (struct ospf_apiserver
138                                                   *apiserv, struct msg *msg);
139 extern int ospf_apiserver_handle_register_event (struct ospf_apiserver *apiserv,
140                                           struct msg *msg);
141 extern int 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                                          u_char lsa_type, u_char opaque_type);
156 extern int ospf_apiserver_unregister_opaque_type (struct ospf_apiserver *apiserver,
157                                            u_char lsa_type,
158                                            u_char opaque_type);
159 extern struct ospf_lsa *ospf_apiserver_opaque_lsa_new (struct ospf_area *area,
160                                                 struct ospf_interface *oi,
161                                                 struct lsa_header *protolsa);
162 extern struct ospf_interface *ospf_apiserver_if_lookup_by_addr (struct in_addr
163                                                          address);
164 extern struct ospf_interface *ospf_apiserver_if_lookup_by_ifp (struct interface
165                                                         *ifp);
166 extern int ospf_apiserver_originate1 (struct ospf_lsa *lsa);
167 extern void ospf_apiserver_flood_opaque_lsa (struct ospf_lsa *lsa);
168
169
170 /* -----------------------------------------------------------
171  * Followings are callback functions to handle opaque types 
172  * -----------------------------------------------------------
173  */
174
175 extern int ospf_apiserver_new_if (struct interface *ifp);
176 extern int ospf_apiserver_del_if (struct interface *ifp);
177 extern void ospf_apiserver_ism_change (struct ospf_interface *oi, int old_status);
178 extern void ospf_apiserver_nsm_change (struct ospf_neighbor *nbr, int old_status);
179 extern void ospf_apiserver_config_write_router (struct vty *vty);
180 extern void ospf_apiserver_config_write_if (struct vty *vty, struct interface *ifp);
181 extern void ospf_apiserver_show_info (struct vty *vty, struct ospf_lsa *lsa);
182 extern int ospf_ospf_apiserver_lsa_originator (void *arg);
183 extern struct ospf_lsa *ospf_apiserver_lsa_refresher (struct ospf_lsa *lsa);
184 extern void ospf_apiserver_flush_opaque_lsa (struct ospf_apiserver *apiserv,
185                                       u_char lsa_type, u_char opaque_type);
186
187 /* -----------------------------------------------------------
188  * Followings are hooks when LSAs are updated or deleted
189  * -----------------------------------------------------------
190  */
191
192
193 /* Hooks that are invoked from ospf opaque module */
194
195 extern int ospf_apiserver_lsa_update (struct ospf_lsa *lsa);
196 extern int ospf_apiserver_lsa_delete (struct ospf_lsa *lsa);
197
198 extern void ospf_apiserver_clients_lsa_change_notify (u_char msgtype,
199                                                struct ospf_lsa *lsa);
200
201 #endif /* _OSPF_APISERVER_H */