1 /* $OpenBSD: ospfe.h,v 1.39 2009/01/31 08:55:00 claudio Exp $ */ 2 3 /* 4 * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #ifndef _OSPFE_H_ 20 #define _OSPFE_H_ 21 22 #define max(x,y) ((x) > (y) ? (x) : (y)) 23 24 #include <sys/types.h> 25 #include <sys/socket.h> 26 #include <netinet/in.h> 27 #include <netinet/in_systm.h> 28 #include <netinet/ip.h> 29 30 TAILQ_HEAD(ctl_conns, ctl_conn) ctl_conns; 31 32 struct lsa_entry { 33 TAILQ_ENTRY(lsa_entry) entry; 34 union { 35 struct lsa_hdr *lu_lsa; 36 struct lsa_ref *lu_ref; 37 } le_data; 38 unsigned short le_when; 39 unsigned short le_oneshot; 40 }; 41 #define le_lsa le_data.lu_lsa 42 #define le_ref le_data.lu_ref 43 44 struct lsa_ref { 45 LIST_ENTRY(lsa_ref) entry; 46 struct lsa_hdr hdr; 47 void *data; 48 time_t stamp; 49 int refcnt; 50 u_int16_t len; 51 }; 52 53 struct nbr_stats { 54 u_int32_t sta_chng; 55 }; 56 57 struct nbr { 58 LIST_ENTRY(nbr) entry, hash; 59 struct event inactivity_timer; 60 struct event db_tx_timer; 61 struct event lsreq_tx_timer; 62 struct event ls_retrans_timer; 63 struct event adj_timer; 64 65 struct nbr_stats stats; 66 67 struct lsa_head ls_retrans_list; 68 struct lsa_head db_sum_list; 69 struct lsa_head ls_req_list; 70 71 struct in_addr addr; 72 struct in_addr id; 73 struct in_addr dr; /* designated router */ 74 struct in_addr bdr; /* backup designated router */ 75 76 struct iface *iface; 77 struct lsa_entry *ls_req; 78 struct lsa_entry *dd_end; 79 80 u_int32_t dd_seq_num; 81 u_int32_t dd_pending; 82 u_int32_t peerid; /* unique ID in DB */ 83 u_int32_t ls_req_cnt; 84 u_int32_t ls_ret_cnt; 85 u_int32_t crypt_seq_num; 86 87 time_t uptime; 88 int state; 89 u_int8_t priority; 90 u_int8_t options; 91 u_int8_t last_rx_options; 92 u_int8_t last_rx_bits; 93 u_int8_t dd_master; 94 u_int8_t dd_more; 95 }; 96 97 /* auth.c */ 98 int auth_validate(void *buf, u_int16_t len, struct iface *, 99 struct nbr *); 100 int auth_gen(struct buf *, struct iface *); 101 void md_list_add(struct auth_md_head *, u_int8_t, char *); 102 void md_list_copy(struct auth_md_head *, struct auth_md_head *); 103 void md_list_clr(struct auth_md_head *); 104 int md_list_send(struct auth_md_head *, struct imsgbuf *); 105 106 /* database.c */ 107 int send_db_description(struct nbr *); 108 void recv_db_description(struct nbr *, char *, u_int16_t); 109 void db_sum_list_add(struct nbr *, struct lsa_hdr *); 110 int db_sum_list_del(struct nbr *, struct lsa_hdr *); 111 void db_sum_list_clr(struct nbr *); 112 void db_tx_timer(int, short, void *); 113 void start_db_tx_timer(struct nbr *); 114 void stop_db_tx_timer(struct nbr *); 115 116 /* hello.c */ 117 int send_hello(struct iface *); 118 void recv_hello(struct iface *, struct in_addr, u_int32_t, 119 char *, u_int16_t); 120 121 /* ospfe.c */ 122 pid_t ospfe(struct ospfd_conf *, int[2], int[2], int[2]); 123 void ospfe_dispatch_main(int, short, void *); 124 void ospfe_dispatch_rde(int, short, void *); 125 int ospfe_imsg_compose_parent(int, pid_t, void *, u_int16_t); 126 int ospfe_imsg_compose_rde(int, u_int32_t, pid_t, void *, 127 u_int16_t); 128 u_int32_t ospfe_router_id(void); 129 void ospfe_fib_update(int); 130 void ospfe_iface_ctl(struct ctl_conn *, unsigned int); 131 void ospfe_nbr_ctl(struct ctl_conn *); 132 void orig_rtr_lsa(struct area *); 133 void orig_net_lsa(struct iface *); 134 void ospfe_demote_area(struct area *, int); 135 void ospfe_demote_iface(struct iface *, int); 136 137 /* interface.c */ 138 int if_fsm(struct iface *, enum iface_event); 139 140 struct iface *if_new(struct kif *, struct kif_addr *); 141 void if_del(struct iface *); 142 void if_init(struct ospfd_conf *, struct iface *); 143 144 int if_act_start(struct iface *); 145 int if_act_elect(struct iface *); 146 int if_act_reset(struct iface *); 147 148 struct ctl_iface *if_to_ctl(struct iface *); 149 150 int if_join_group(struct iface *, struct in_addr *); 151 int if_leave_group(struct iface *, struct in_addr *); 152 int if_set_mcast(struct iface *); 153 int if_set_recvif(int, int); 154 void if_set_recvbuf(int); 155 int if_set_mcast_loop(int); 156 int if_set_ip_hdrincl(int); 157 158 /* lsack.c */ 159 int delay_lsa_ack(struct iface *, struct lsa_hdr *); 160 int send_ls_ack(struct iface *, struct in_addr, void *, size_t); 161 void recv_ls_ack(struct nbr *, char *, u_int16_t); 162 int lsa_hdr_check(struct nbr *, struct lsa_hdr *); 163 void ls_ack_list_add(struct iface *, struct lsa_hdr *); 164 void ls_ack_list_free(struct iface *, struct lsa_entry *); 165 void ls_ack_list_clr(struct iface *); 166 int ls_ack_list_empty(struct iface *); 167 void ls_ack_tx_timer(int, short, void *); 168 void start_ls_ack_tx_timer(struct iface *); 169 void stop_ls_ack_tx_timer(struct iface *); 170 171 /* lsreq.c */ 172 int send_ls_req(struct nbr *); 173 void recv_ls_req(struct nbr *, char *, u_int16_t); 174 void ls_req_list_add(struct nbr *, struct lsa_hdr *); 175 int ls_req_list_del(struct nbr *, struct lsa_hdr *); 176 struct lsa_entry *ls_req_list_get(struct nbr *, struct lsa_hdr *); 177 void ls_req_list_free(struct nbr *, struct lsa_entry *); 178 void ls_req_list_clr(struct nbr *); 179 int ls_req_list_empty(struct nbr *); 180 void ls_req_tx_timer(int, short, void *); 181 void start_ls_req_tx_timer(struct nbr *); 182 void stop_ls_req_tx_timer(struct nbr *); 183 184 /* lsupdate.c */ 185 int lsa_flood(struct iface *, struct nbr *, struct lsa_hdr *, 186 void *); 187 void recv_ls_update(struct nbr *, char *, u_int16_t); 188 189 void ls_retrans_list_add(struct nbr *, struct lsa_hdr *, 190 unsigned short, unsigned short); 191 int ls_retrans_list_del(struct nbr *, struct lsa_hdr *); 192 struct lsa_entry *ls_retrans_list_get(struct nbr *, struct lsa_hdr *); 193 void ls_retrans_list_free(struct nbr *, struct lsa_entry *); 194 void ls_retrans_list_clr(struct nbr *); 195 void ls_retrans_timer(int, short, void *); 196 197 void lsa_cache_init(u_int32_t); 198 struct lsa_ref *lsa_cache_add(void *, u_int16_t); 199 struct lsa_ref *lsa_cache_get(struct lsa_hdr *); 200 void lsa_cache_put(struct lsa_ref *, struct nbr *); 201 202 /* neighbor.c */ 203 void nbr_init(u_int32_t); 204 struct nbr *nbr_new(u_int32_t, struct iface *, int); 205 void nbr_del(struct nbr *); 206 207 struct nbr *nbr_find_id(struct iface *, u_int32_t); 208 struct nbr *nbr_find_peerid(u_int32_t); 209 210 int nbr_fsm(struct nbr *, enum nbr_event); 211 212 void nbr_itimer(int, short, void *); 213 void nbr_start_itimer(struct nbr *); 214 void nbr_stop_itimer(struct nbr *); 215 void nbr_reset_itimer(struct nbr *); 216 217 void nbr_adj_timer(int, short, void *); 218 void nbr_start_adj_timer(struct nbr *); 219 220 int nbr_act_reset_itimer(struct nbr *); 221 int nbr_act_start_itimer(struct nbr *); 222 int nbr_act_eval(struct nbr *); 223 int nbr_act_snapshot(struct nbr *); 224 int nbr_act_exchange_done(struct nbr *); 225 int nbr_act_adj_ok(struct nbr *); 226 int nbr_act_restart_dd(struct nbr *); 227 int nbr_act_delete(struct nbr *); 228 int nbr_act_clear_lists(struct nbr *); 229 int nbr_act_hello_check(struct nbr *); 230 231 struct ctl_nbr *nbr_to_ctl(struct nbr *); 232 233 struct lsa_hdr *lsa_hdr_new(void); 234 235 /* packet.c */ 236 int gen_ospf_hdr(struct buf *, struct iface *, u_int8_t); 237 int send_packet(struct iface *, struct buf *, struct sockaddr_in *); 238 void recv_packet(int, short, void *); 239 240 char *pkt_ptr; /* packet buffer */ 241 242 #endif /* _OSPFE_H_ */ 243