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