1 /* $OpenBSD: ospfe.h,v 1.26 2024/05/18 11:17:30 jsg 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/ip.h> 28 29 struct lsa_entry { 30 TAILQ_ENTRY(lsa_entry) entry; 31 union { 32 struct lsa_hdr *lu_lsa; 33 struct lsa_ref *lu_ref; 34 } le_data; 35 unsigned short le_when; 36 unsigned short le_oneshot; 37 }; 38 #define le_lsa le_data.lu_lsa 39 #define le_ref le_data.lu_ref 40 41 struct lsa_ref { 42 LIST_ENTRY(lsa_ref) entry; 43 struct lsa_hdr hdr; 44 void *data; 45 time_t stamp; 46 int refcnt; 47 u_int16_t len; 48 }; 49 50 struct nbr_stats { 51 u_int32_t sta_chng; 52 }; 53 54 struct nbr { 55 LIST_ENTRY(nbr) entry, hash; 56 struct event inactivity_timer; 57 struct event db_tx_timer; 58 struct event lsreq_tx_timer; 59 struct event ls_retrans_timer; 60 struct event adj_timer; 61 62 struct nbr_stats stats; 63 64 struct lsa_head ls_retrans_list; 65 struct lsa_head db_sum_list; 66 struct lsa_head ls_req_list; 67 68 struct in6_addr addr; /* ip6 address */ 69 struct in_addr id; /* router id */ 70 struct in_addr dr; /* designated router */ 71 struct in_addr bdr; /* backup designated router */ 72 73 struct iface *iface; 74 struct lsa_entry *ls_req; 75 struct lsa_entry *dd_end; 76 77 u_int32_t iface_id; /* id of neighbor's iface */ 78 u_int32_t dd_seq_num; 79 u_int32_t dd_pending; 80 u_int32_t peerid; /* unique ID in DB */ 81 u_int32_t ls_req_cnt; 82 u_int32_t ls_ret_cnt; 83 u_int32_t options; 84 u_int32_t last_rx_options; 85 u_int32_t link_options; /* options from link-LSA */ 86 87 time_t uptime; 88 int state; 89 u_int8_t priority; 90 u_int8_t last_rx_bits; 91 u_int8_t dd_master; 92 u_int8_t dd_more; 93 u_int8_t dd_snapshot; /* snapshot running */ 94 }; 95 96 struct ctl_conn; 97 98 /* database.c */ 99 int send_db_description(struct nbr *); 100 void recv_db_description(struct nbr *, char *, u_int16_t); 101 void db_sum_list_add(struct nbr *, struct lsa_hdr *); 102 void db_sum_list_clr(struct nbr *); 103 void db_tx_timer(int, short, void *); 104 void start_db_tx_timer(struct nbr *); 105 void stop_db_tx_timer(struct nbr *); 106 107 /* hello.c */ 108 int send_hello(struct iface *); 109 void recv_hello(struct iface *, struct in6_addr *, u_int32_t, 110 char *, u_int16_t); 111 112 /* ospfe.c */ 113 pid_t ospfe(struct ospfd_conf *, int[2], int[2], int[2]); 114 void ospfe_dispatch_main(int, short, void *); 115 void ospfe_dispatch_rde(int, short, void *); 116 int ospfe_imsg_compose_parent(int, pid_t, void *, u_int16_t); 117 int ospfe_imsg_compose_rde(int, u_int32_t, pid_t, void *, 118 u_int16_t); 119 u_int32_t ospfe_router_id(void); 120 void ospfe_fib_update(int); 121 void ospfe_iface_ctl(struct ctl_conn *, unsigned int); 122 void ospfe_nbr_ctl(struct ctl_conn *); 123 void orig_rtr_lsa(struct area *); 124 void orig_net_lsa(struct iface *); 125 void orig_link_lsa(struct iface *); 126 void ospfe_demote_area(struct area *, int); 127 void ospfe_demote_iface(struct iface *, int); 128 129 /* interface.c */ 130 int if_fsm(struct iface *, enum iface_event); 131 132 void if_del(struct iface *); 133 void if_start(struct ospfd_conf *, struct iface *); 134 135 int if_act_start(struct iface *); 136 int if_act_elect(struct iface *); 137 int if_act_reset(struct iface *); 138 139 struct ctl_iface *if_to_ctl(struct iface *); 140 141 int if_join_group(struct iface *, struct in6_addr *); 142 int if_leave_group(struct iface *, struct in6_addr *); 143 int if_set_mcast(struct iface *); 144 void if_set_sockbuf(int); 145 int if_set_mcast_loop(int); 146 int if_set_ipv6_pktinfo(int, int); 147 int if_set_ipv6_checksum(int); 148 149 /* lsack.c */ 150 int send_direct_ack(struct iface *, struct in6_addr, void *, size_t); 151 void recv_ls_ack(struct nbr *, char *, u_int16_t); 152 int lsa_hdr_check(struct nbr *, struct lsa_hdr *); 153 void ls_ack_list_add(struct iface *, struct lsa_hdr *); 154 void ls_ack_list_free(struct iface *, struct lsa_entry *); 155 void ls_ack_list_clr(struct iface *); 156 int ls_ack_list_empty(struct iface *); 157 void ls_ack_tx_timer(int, short, void *); 158 void start_ls_ack_tx_timer(struct iface *); 159 void stop_ls_ack_tx_timer(struct iface *); 160 161 /* lsreq.c */ 162 int send_ls_req(struct nbr *); 163 void recv_ls_req(struct nbr *, char *, u_int16_t); 164 void ls_req_list_add(struct nbr *, struct lsa_hdr *); 165 struct lsa_entry *ls_req_list_get(struct nbr *, struct lsa_hdr *); 166 void ls_req_list_free(struct nbr *, struct lsa_entry *); 167 void ls_req_list_clr(struct nbr *); 168 int ls_req_list_empty(struct nbr *); 169 void ls_req_tx_timer(int, short, void *); 170 void start_ls_req_tx_timer(struct nbr *); 171 void stop_ls_req_tx_timer(struct nbr *); 172 173 /* lsupdate.c */ 174 int lsa_flood(struct iface *, struct nbr *, struct lsa_hdr *, 175 void *); 176 void recv_ls_update(struct nbr *, char *, u_int16_t); 177 178 void ls_retrans_list_add(struct nbr *, struct lsa_hdr *, 179 unsigned short, unsigned short); 180 int ls_retrans_list_del(struct nbr *, struct lsa_hdr *); 181 struct lsa_entry *ls_retrans_list_get(struct nbr *, struct lsa_hdr *); 182 void ls_retrans_list_free(struct nbr *, struct lsa_entry *); 183 void ls_retrans_list_clr(struct nbr *); 184 void ls_retrans_timer(int, short, void *); 185 186 void lsa_cache_init(u_int32_t); 187 struct lsa_ref *lsa_cache_add(void *, u_int16_t); 188 struct lsa_ref *lsa_cache_get(struct lsa_hdr *); 189 void lsa_cache_put(struct lsa_ref *, struct nbr *); 190 191 /* neighbor.c */ 192 void nbr_init(u_int32_t); 193 struct nbr *nbr_new(u_int32_t, struct iface *, u_int32_t, int, 194 struct in6_addr *); 195 void nbr_del(struct nbr *); 196 197 struct nbr *nbr_find_id(struct iface *, u_int32_t); 198 struct nbr *nbr_find_peerid(u_int32_t); 199 200 int nbr_fsm(struct nbr *, enum nbr_event); 201 202 void nbr_itimer(int, short, void *); 203 void nbr_start_itimer(struct nbr *); 204 void nbr_stop_itimer(struct nbr *); 205 void nbr_reset_itimer(struct nbr *); 206 207 void nbr_adj_timer(int, short, void *); 208 void nbr_start_adj_timer(struct nbr *); 209 210 int nbr_act_reset_itimer(struct nbr *); 211 int nbr_act_start_itimer(struct nbr *); 212 int nbr_act_eval(struct nbr *); 213 int nbr_act_snapshot(struct nbr *); 214 int nbr_act_exchange_done(struct nbr *); 215 int nbr_act_adj_ok(struct nbr *); 216 int nbr_act_restart_dd(struct nbr *); 217 int nbr_act_delete(struct nbr *); 218 int nbr_act_clear_lists(struct nbr *); 219 int nbr_act_hello_check(struct nbr *); 220 221 struct ctl_nbr *nbr_to_ctl(struct nbr *); 222 223 struct lsa_hdr *lsa_hdr_new(void); 224 225 /* packet.c */ 226 int gen_ospf_hdr(struct ibuf *, struct iface *, u_int8_t); 227 int upd_ospf_hdr(struct ibuf *, struct iface *); 228 int send_packet(struct iface *, struct ibuf *, struct in6_addr *); 229 void recv_packet(int, short, void *); 230 231 #endif /* _OSPFE_H_ */ 232