xref: /openbsd/usr.sbin/eigrpd/eigrpe.h (revision 838745b6)
1 /*	$OpenBSD: eigrpe.h,v 1.17 2021/01/19 10:31:12 claudio Exp $ */
2 
3 /*
4  * Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
5  * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 #ifndef _EIGRPE_H_
21 #define _EIGRPE_H_
22 
23 #include <sys/queue.h>
24 #include <sys/tree.h>
25 
26 #include <event.h>
27 
28 TAILQ_HEAD(ctl_conns, ctl_conn)	ctl_conns;
29 
30 struct pbuf {
31 	struct ibuf		*buf;
32 	int			 refcnt;
33 };
34 
35 struct packet {
36 	TAILQ_ENTRY(packet)	 entry;
37 	struct nbr		*nbr;
38 	uint32_t		 seq_num;
39 	struct pbuf		*pbuf;
40 	struct event		 ev_timeout;
41 	int			 attempts;
42 };
43 
44 struct nbr {
45 	RB_ENTRY(nbr)		 addr_tree, pid_tree;
46 	TAILQ_ENTRY(nbr)	 entry;
47 	struct event		 ev_ack;
48 	struct event		 ev_hello_timeout;
49 	struct eigrp_iface	*ei;
50 	union eigrpd_addr	 addr;
51 	uint32_t		 peerid;
52 	time_t			 uptime;
53 	uint16_t		 hello_holdtime;
54 	uint8_t			 flags;
55 #define F_EIGRP_NBR_SELF		0x01
56 #define F_EIGRP_NBR_PENDING		0x02
57 #define F_EIGRP_NBR_CR_MODE		0x04
58 
59 	struct rinfo_head	 update_list;	/* unicast updates */
60 	struct rinfo_head	 query_list;	/* unicast queries  */
61 	struct rinfo_head	 reply_list;	/* unicast replies */
62 
63 	/* RTP */
64 	uint32_t		 recv_seq;
65 	uint32_t		 next_mcast_seq;
66 	TAILQ_HEAD(, packet)	 retrans_list;
67 };
68 RB_PROTOTYPE(nbr_addr_head, nbr, addr_tree, nbr_compare)
69 RB_PROTOTYPE(nbr_pid_head, nbr, pid_tree, nbr_pid_compare)
70 
71 #define PREFIX_SIZE4(x)	(((x - 1) / 8) + 1)
72 #define PREFIX_SIZE6(x)	((x == 128) ? 16 : ((x / 8) + 1))
73 
74 extern struct eigrpd_conf        *econf;
75 
76 /* eigrpe.c */
77 void		 eigrpe(int, int, char *);
78 int		 eigrpe_imsg_compose_parent(int, pid_t, void *, uint16_t);
79 int		 eigrpe_imsg_compose_rde(int, uint32_t, pid_t, void *,
80 		    uint16_t);
81 void		 eigrpe_instance_init(struct eigrp *);
82 void		 eigrpe_instance_del(struct eigrp *);
83 void		 message_add(struct rinfo_head *, struct rinfo *);
84 void		 message_list_clr(struct rinfo_head *);
85 void		 seq_addr_list_clr(struct seq_addr_head *);
86 void		 eigrpe_orig_local_route(struct eigrp_iface *,
87 		    struct if_addr *, int);
88 void		 eigrpe_iface_ctl(struct ctl_conn *, unsigned int);
89 void		 eigrpe_nbr_ctl(struct ctl_conn *);
90 void		 eigrpe_stats_ctl(struct ctl_conn *);
91 
92 /* interface.c */
93 struct iface		*if_lookup(struct eigrpd_conf *, unsigned int);
94 void			 if_addr_new(struct iface *, struct kaddr *);
95 void			 if_addr_del(struct iface *, struct kaddr *);
96 in_addr_t		 if_primary_addr(struct iface *);
97 uint8_t			 if_primary_addr_prefixlen(struct iface *);
98 void			 if_update(struct iface *, int);
99 struct eigrp_iface	*eigrp_if_new(struct eigrpd_conf *, struct eigrp *,
100 			    struct kif *);
101 void			 eigrp_if_del(struct eigrp_iface *);
102 struct eigrp_iface	*eigrp_if_lookup(struct iface *, int, uint16_t);
103 struct eigrp_iface	*eigrp_if_lookup_id(uint32_t);
104 struct ctl_iface	*if_to_ctl(struct eigrp_iface *);
105 void			 if_set_sockbuf(int);
106 int			 if_set_ipv4_mcast_ttl(int, uint8_t);
107 int			 if_set_ipv4_mcast(struct iface *);
108 int			 if_set_ipv4_mcast_loop(int);
109 int			 if_set_ipv4_recvif(int, int);
110 int			 if_set_ipv4_hdrincl(int);
111 int			 if_set_ipv6_mcast(struct iface *);
112 int			 if_set_ipv6_mcast_loop(int);
113 int			 if_set_ipv6_pktinfo(int, int);
114 int			 if_set_ipv6_dscp(int, int);
115 
116 /* neighbor.c */
117 struct nbr	*nbr_new(struct eigrp_iface *, union eigrpd_addr *,
118 		    uint16_t, int);
119 void		 nbr_init(struct nbr *);
120 void		 nbr_del(struct nbr *);
121 struct nbr	*nbr_find(struct eigrp_iface *, union eigrpd_addr *);
122 struct nbr	*nbr_find_peerid(uint32_t);
123 struct ctl_nbr	*nbr_to_ctl(struct nbr *);
124 void		 nbr_clear_ctl(struct ctl_nbr *);
125 void		 nbr_start_timeout(struct nbr *);
126 
127 /* rtp.c */
128 void		 rtp_packet_del(struct packet *);
129 void		 rtp_process_ack(struct nbr *, uint32_t);
130 void		 rtp_send_ucast(struct nbr *, struct ibuf *);
131 void		 rtp_send(struct eigrp_iface *, struct nbr *, struct ibuf *);
132 void		 rtp_send_ack(struct nbr *);
133 void		 rtp_ack_timer(int, short, void *);
134 void		 rtp_ack_start_timer(struct nbr *);
135 void		 rtp_ack_stop_timer(struct nbr *);
136 
137 /* packet.c */
138 int	 gen_eigrp_hdr(struct ibuf *, uint16_t, uint8_t, uint32_t,
139 	    uint16_t);
140 int	 send_packet(struct eigrp_iface *, struct nbr *, uint32_t,
141 	    struct ibuf *);
142 void	 recv_packet(int, short, void *);
143 
144 /* tlv.c */
145 int			 gen_parameter_tlv(struct ibuf *, struct eigrp_iface *,
146 			    int);
147 int			 gen_sequence_tlv(struct ibuf *,
148 			    struct seq_addr_head *);
149 int			 gen_sw_version_tlv(struct ibuf *);
150 int			 gen_mcast_seq_tlv(struct ibuf *, uint32_t);
151 uint16_t		 len_route_tlv(struct rinfo *);
152 int			 gen_route_tlv(struct ibuf *, struct rinfo *);
153 struct tlv_parameter	*tlv_decode_parameter(struct tlv *, char *);
154 int			 tlv_decode_seq(int, struct tlv *, char *,
155 			    struct seq_addr_head *);
156 struct tlv_sw_version	*tlv_decode_sw_version(struct tlv *, char *);
157 struct tlv_mcast_seq	*tlv_decode_mcast_seq(struct tlv *, char *);
158 int			 tlv_decode_route(int, struct tlv *, char *,
159 			    struct rinfo *);
160 void			 metric_encode_mtu(uint8_t *, int);
161 int			 metric_decode_mtu(uint8_t *);
162 
163 /* hello.c */
164 void	 send_hello(struct eigrp_iface *, struct seq_addr_head *, uint32_t);
165 void	 send_peerterm(struct nbr *);
166 void	 recv_hello(struct eigrp_iface *, union eigrpd_addr *, struct nbr *,
167 	    struct tlv_parameter *);
168 
169 /* update.c */
170 void	 send_update(struct eigrp_iface *, struct nbr *, uint32_t,
171 	    struct rinfo_head *);
172 void	 recv_update(struct nbr *, struct rinfo_head *, uint32_t);
173 
174 /* query.c */
175 void	 send_query(struct eigrp_iface *, struct nbr *, struct rinfo_head *,
176 	    int);
177 void	 recv_query(struct nbr *, struct rinfo_head *, int);
178 
179 /* reply.c */
180 void	 send_reply(struct nbr *, struct rinfo_head *, int);
181 void	 recv_reply(struct nbr *, struct rinfo_head *, int);
182 
183 #endif	/* _EIGRPE_H_ */
184