summaryrefslogtreecommitdiff
path: root/usr.sbin/ospfd/ospfe.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/ospfd/ospfe.h')
-rw-r--r--usr.sbin/ospfd/ospfe.h286
1 files changed, 286 insertions, 0 deletions
diff --git a/usr.sbin/ospfd/ospfe.h b/usr.sbin/ospfd/ospfe.h
new file mode 100644
index 00000000000..0e0281cbfbd
--- /dev/null
+++ b/usr.sbin/ospfd/ospfe.h
@@ -0,0 +1,286 @@
+/* $OpenBSD: ospfe.h,v 1.1 2005/01/28 14:05:40 claudio Exp $ */
+
+/*
+ * Copyright (c) 2004, 2005 Esben Norby <esben.norby@ericsson.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _OSPFE_H_
+#define _OSPFE_H_
+
+#define max(x,y) ((x) > (y) ? (x) : (y))
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+
+TAILQ_HEAD(ctl_conns, ctl_conn) ctl_conns;
+
+/* neighbor states */
+#define NBR_STA_DOWN 0x0001
+#define NBR_STA_ATTEMPT 0x0002
+#define NBR_STA_INIT 0x0004
+#define NBR_STA_2_WAY 0x0008
+#define NBR_STA_XSTRT 0x0010
+#define NBR_STA_SNAP 0x0020
+#define NBR_STA_XCHNG 0x0040
+#define NBR_STA_LOAD 0x0080
+#define NBR_STA_FULL 0x0100
+#define NBR_STA_ACTIVE 0xfffc
+#define NBR_STA_FLOOD (NBR_STA_XCHNG | NBR_STA_LOAD | NBR_STA_FULL)
+#define NBR_STA_ADJFORM (NBR_STA_XSTRT | NBR_STA_SNAP | NBR_STA_FLOOD)
+#define NBR_STA_BIDIR (NBR_STA_2_WAY | NBR_STA_ADJFORM)
+#define NBR_STA_PRELIM (NBR_STA_DOWN | NBR_STA_ATTEMPT | NBR_STA_INIT)
+#define NBR_STA_ANY 0xffff
+
+/* neighbor events */
+enum nbr_event {
+ NBR_EVT_NOTHING,
+ NBR_EVT_HELLO_RCVD,
+ NBR_EVT_STRT,
+ NBR_EVT_2_WAY_RCVD,
+ NBR_EVT_NEG_DONE,
+ NBR_EVT_SNAP_DONE,
+ NBR_EVT_XCHNG_DONE,
+ NBR_EVT_BAD_LS_REQ,
+ NBR_EVT_LOAD_DONE,
+ NBR_EVT_ADJ_OK,
+ NBR_EVT_SEQ_NUM_MIS,
+ NBR_EVT_1_WAY_RCVD,
+ NBR_EVT_KILL_NBR,
+ NBR_EVT_ITIMER,
+ NBR_EVT_LL_DOWN,
+ NBR_EVT_ADJTMOUT
+};
+
+/* neighbor actions */
+enum nbr_action {
+ NBR_ACT_NOTHING,
+ NBR_ACT_STRT,
+ NBR_ACT_RST_ITIMER,
+ NBR_ACT_STRT_ITIMER,
+ NBR_ACT_EVAL,
+ NBR_ACT_SNAP,
+ NBR_ACT_SNAP_DONE,
+ NBR_ACT_XCHNG_DONE,
+ NBR_ACT_ADJ_OK,
+ NBR_ACT_RESTRT_DD,
+ NBR_ACT_DEL,
+ NBR_ACT_CLR_LST,
+ NBR_ACT_HELLO_CHK
+};
+
+struct lsa_entry {
+ TAILQ_ENTRY(lsa_entry) entry;
+ union {
+ struct lsa_hdr *lu_lsa;
+ struct lsa_ref *lu_ref;
+ } le_data;
+};
+#define le_lsa le_data.lu_lsa
+#define le_ref le_data.lu_ref
+
+struct lsa_ref {
+ LIST_ENTRY(lsa_ref) entry;
+ struct lsa_hdr hdr;
+ void *data;
+ time_t stamp;
+ int refcnt;
+ u_int16_t len;
+};
+
+struct nbr_stats {
+ u_int32_t sta_chng;
+};
+
+struct nbr {
+ LIST_ENTRY(nbr) entry, hash;
+ struct event inactivity_timer;
+ struct event db_tx_timer;
+ struct event lsreq_tx_timer;
+ struct event adj_timer;
+
+ struct nbr_stats stats;
+
+ struct lsa_head ls_retrans_list;
+ struct lsa_head db_sum_list;
+ struct lsa_head ls_req_list;
+
+ struct in_addr addr;
+ struct in_addr id;
+ struct in_addr dr; /* designated router */
+ struct in_addr bdr; /* backup designated router */
+
+ struct iface *iface;
+ struct lsa_entry *ls_req;
+ struct lsa_entry *dd_end;
+
+ u_int32_t dd_seq_num;
+ u_int32_t peerid; /* unique ID in DB */
+
+ u_int32_t ls_req_cnt;
+
+ int state;
+ u_int8_t priority;
+ u_int8_t options;
+ u_int8_t last_rx_options;
+ u_int8_t last_rx_bits;
+
+ bool master;
+};
+
+/* auth.c */
+int auth_validate(struct ospf_hdr *, const struct iface *);
+int auth_gen(void *, u_int16_t, const struct iface *);
+
+/* database.c */
+int send_db_description(struct nbr *);
+void recv_db_description(struct nbr *, char *, u_int16_t);
+void db_sum_list_add(struct nbr *, struct lsa_hdr *);
+int db_sum_list_del(struct nbr *, struct lsa_hdr *);
+void db_sum_list_clr(struct nbr *);
+void db_tx_timer(int, short, void *);
+int start_db_tx_timer(struct nbr *);
+int stop_db_tx_timer(struct nbr *);
+
+/* hello.c */
+int send_hello(struct iface *);
+void recv_hello(struct iface *, struct in_addr, u_int32_t,
+ char *, u_int16_t);
+
+/* ospfe.c */
+pid_t ospfe(struct ospfd_conf *, int[2], int[2], int[2]);
+void ospfe_dispatch_main(int, short, void *);
+void ospfe_dispatch_rde(int, short, void *);
+int ospfe_imsg_compose_parent(int, pid_t, void *, u_int16_t);
+int ospfe_imsg_compose_rde(int, u_int32_t, pid_t, void *,
+ u_int16_t);
+u_int32_t ospfe_router_id(void);
+void ospfe_iface_ctl(struct ctl_conn *, unsigned int);
+void ospfe_nbr_ctl(struct ctl_conn *);
+
+/* interface.c */
+int if_fsm(struct iface *, enum iface_event);
+
+struct iface *if_new(char *, unsigned int);
+int if_del(struct iface *);
+int if_init(struct ospfd_conf *);
+int if_shutdown(struct ospfd_conf *);
+
+int if_act_start(struct iface *);
+int if_act_elect(struct iface *);
+int if_act_reset(struct iface *);
+
+struct ctl_iface *if_to_ctl(struct iface *);
+
+const char *if_state_name(int);
+const char *if_event_name(int);
+const char *if_action_name(int);
+const char *if_type_name(int);
+const char *if_auth_name(int);
+
+int if_join_group(struct iface *, struct in_addr *);
+int if_leave_group(struct iface *, struct in_addr *);
+int if_set_mcast(struct iface *);
+
+/* lsack.c */
+int delay_lsa_ack(struct iface *, struct lsa_hdr *);
+int send_ls_ack(struct iface *, struct in_addr, void *data, int len);
+void recv_ls_ack(struct nbr *, char *, u_int16_t);
+int lsa_hdr_check(struct nbr *, struct lsa_hdr *);
+void ls_ack_list_add(struct iface *, struct lsa_hdr *);
+void ls_ack_list_free(struct iface *, struct lsa_entry *);
+void ls_ack_list_clr(struct iface *);
+bool ls_ack_list_empty(struct iface *);
+void ls_ack_tx_timer(int, short, void *);
+int start_ls_ack_tx_timer(struct iface *);
+int stop_ls_ack_tx_timer(struct iface *);
+
+/* lsreq.c */
+int send_ls_req(struct nbr *);
+void recv_ls_req(struct nbr *, char *, u_int16_t);
+void ls_req_list_add(struct nbr *, struct lsa_hdr *);
+int ls_req_list_del(struct nbr *, struct lsa_hdr *);
+struct lsa_entry *ls_req_list_get(struct nbr *, struct lsa_hdr *);
+void ls_req_list_free(struct nbr *, struct lsa_entry *);
+void ls_req_list_clr(struct nbr *);
+bool ls_req_list_empty(struct nbr *);
+void ls_req_tx_timer(int, short, void *);
+int start_ls_req_tx_timer(struct nbr *);
+int stop_ls_req_tx_timer(struct nbr *);
+
+/* lsupdate.c */
+int lsa_flood(struct iface *, struct nbr *, struct lsa_hdr *,
+ void *, u_int16_t);
+int send_ls_update(struct iface *, struct in_addr, void *, int);
+void recv_ls_update(struct nbr *, char *, u_int16_t);
+
+int ls_retrans_list_add(struct nbr *, struct lsa_hdr *);
+int ls_retrans_list_del(struct nbr *, struct lsa_hdr *);
+struct lsa_entry *ls_retrans_list_get(struct nbr *, struct lsa_hdr *);
+void ls_retrans_list_free(struct nbr *, struct lsa_entry *);
+void ls_retrans_list_clr(struct nbr *);
+bool ls_retrans_list_empty(struct nbr *);
+
+void lsa_cache_init(u_int32_t);
+struct lsa_ref *lsa_cache_add(void *, u_int16_t);
+struct lsa_ref *lsa_cache_get(struct lsa_hdr *);
+void lsa_cache_put(struct lsa_ref *, struct nbr *);
+
+/* neighbor.c */
+void nbr_init(u_int32_t);
+struct nbr *nbr_new(u_int32_t, struct iface *, int);
+int nbr_del(struct nbr *);
+
+struct nbr *nbr_find_id(struct iface *, u_int32_t);
+struct nbr *nbr_find_peerid(u_int32_t);
+
+int nbr_fsm(struct nbr *, enum nbr_event);
+
+void nbr_itimer(int, short, void *);
+int nbr_start_itimer(struct nbr *);
+int nbr_stop_itimer(struct nbr *);
+int nbr_reset_itimer(struct nbr *);
+
+void nbr_adj_timer(int, short, void *);
+int nbr_start_adj_timer(struct nbr *);
+
+int nbr_act_start(struct nbr *);
+int nbr_act_reset_itimer(struct nbr *);
+int nbr_act_start_itimer(struct nbr *);
+int nbr_act_eval(struct nbr *);
+int nbr_act_snapshot(struct nbr *);
+int nbr_act_exchange_done(struct nbr *);
+int nbr_act_adj_ok(struct nbr *);
+int nbr_act_restart_dd(struct nbr *);
+int nbr_act_delete(struct nbr *);
+int nbr_act_clear_lists(struct nbr *);
+int nbr_act_hello_check(struct nbr *);
+
+struct ctl_nbr *nbr_to_ctl(struct nbr *);
+
+const char *nbr_state_name(int);
+const char *nbr_event_name(int);
+const char *nbr_action_name(int);
+
+struct lsa_hdr *lsa_hdr_new(void);
+
+/* packet.c */
+void gen_ospf_hdr(void *, struct iface *, u_int8_t);
+int send_packet(struct iface *, char *, int, struct sockaddr_in *);
+void recv_packet(int, short, void *);
+
+#endif /* _OSPFE_H_ */