]>
git.proxmox.com Git - mirror_frr.git/blob - ldpd/lde.h
4 * Copyright (c) 2013, 2016 Renato Westphal <renato@openbsd.org>
5 * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org>
6 * Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24 #include "openbsd-queue.h"
25 #include "openbsd-tree.h"
38 struct in_addr prefix
;
42 struct in6_addr prefix
;
48 struct in_addr lsr_id
;
52 RB_HEAD(fec_tree
, fec
);
53 RB_PROTOTYPE(fec_tree
, fec
, entry
, fec_compare
)
64 LIST_ENTRY(lde_map
) entry
;
65 struct lde_nbr
*nexthop
;
69 /* withdraw entries */
75 /* Addresses belonging to neighbor */
77 TAILQ_ENTRY(lde_addr
) entry
;
82 /* just the info LDE needs */
84 RB_ENTRY(lde_nbr
) entry
;
87 int v4_enabled
; /* announce/process v4 msgs */
88 int v6_enabled
; /* announce/process v6 msgs */
89 struct fec_tree recv_req
;
90 struct fec_tree sent_req
;
91 struct fec_tree recv_map
;
92 struct fec_tree sent_map
;
93 struct fec_tree sent_wdraw
;
94 TAILQ_HEAD(, lde_addr
) addr_list
;
96 RB_HEAD(nbr_tree
, lde_nbr
);
97 RB_PROTOTYPE(nbr_tree
, lde_nbr
, entry
, lde_nbr_compare
)
100 LIST_ENTRY(fec_nh
) entry
;
102 union ldpd_addr nexthop
;
103 uint32_t remote_label
;
110 LIST_HEAD(, fec_nh
) nexthops
; /* fib nexthops */
111 LIST_HEAD(, lde_map
) downstream
; /* recv mappings */
112 LIST_HEAD(, lde_map
) upstream
; /* sent mappings */
114 uint32_t local_label
;
115 void *data
; /* fec specific data */
118 #define LDE_GC_INTERVAL 300
120 extern struct ldpd_conf
*ldeconf
;
121 extern struct fec_tree ft
;
122 extern struct nbr_tree lde_nbrs
;
123 extern struct thread
*gc_timer
;
126 void lde(const char *, const char *);
127 int lde_imsg_compose_parent(int, pid_t
, void *, uint16_t);
128 int lde_imsg_compose_ldpe(int, uint32_t, pid_t
, void *, uint16_t);
129 uint32_t lde_assign_label(void);
130 void lde_send_change_klabel(struct fec_node
*, struct fec_nh
*);
131 void lde_send_delete_klabel(struct fec_node
*, struct fec_nh
*);
132 void lde_fec2map(struct fec
*, struct map
*);
133 void lde_map2fec(struct map
*, struct in_addr
, struct fec
*);
134 void lde_send_labelmapping(struct lde_nbr
*, struct fec_node
*,
136 void lde_send_labelwithdraw(struct lde_nbr
*, struct fec_node
*,
137 uint32_t, struct status_tlv
*);
138 void lde_send_labelwithdraw_all(struct fec_node
*, uint32_t);
139 void lde_send_labelrelease(struct lde_nbr
*, struct fec_node
*,
141 void lde_send_notification(uint32_t, uint32_t, uint32_t, uint16_t);
142 struct lde_nbr
*lde_nbr_find_by_lsrid(struct in_addr
);
143 struct lde_nbr
*lde_nbr_find_by_addr(int, union ldpd_addr
*);
144 struct lde_map
*lde_map_add(struct lde_nbr
*, struct fec_node
*, int);
145 void lde_map_del(struct lde_nbr
*, struct lde_map
*, int);
146 struct lde_req
*lde_req_add(struct lde_nbr
*, struct fec
*, int);
147 void lde_req_del(struct lde_nbr
*, struct lde_req
*, int);
148 struct lde_wdraw
*lde_wdraw_add(struct lde_nbr
*, struct fec_node
*);
149 void lde_wdraw_del(struct lde_nbr
*, struct lde_wdraw
*);
150 void lde_change_egress_label(int, int);
151 struct lde_addr
*lde_address_find(struct lde_nbr
*, int,
155 void fec_init(struct fec_tree
*);
156 struct fec
*fec_find(struct fec_tree
*, struct fec
*);
157 int fec_insert(struct fec_tree
*, struct fec
*);
158 int fec_remove(struct fec_tree
*, struct fec
*);
159 void fec_clear(struct fec_tree
*, void (*)(void *));
161 void fec_snap(struct lde_nbr
*);
162 void fec_tree_clear(void);
163 struct fec_nh
*fec_nh_find(struct fec_node
*, int, union ldpd_addr
*,
165 uint32_t egress_label(enum fec_type
);
166 void lde_kernel_insert(struct fec
*, int, union ldpd_addr
*,
167 uint8_t, int, void *);
168 void lde_kernel_remove(struct fec
*, int, union ldpd_addr
*,
170 void lde_check_mapping(struct map
*, struct lde_nbr
*);
171 void lde_check_request(struct map
*, struct lde_nbr
*);
172 void lde_check_release(struct map
*, struct lde_nbr
*);
173 void lde_check_release_wcard(struct map
*, struct lde_nbr
*);
174 void lde_check_withdraw(struct map
*, struct lde_nbr
*);
175 void lde_check_withdraw_wcard(struct map
*, struct lde_nbr
*);
176 int lde_gc_timer(struct thread
*);
177 void lde_gc_start_timer(void);
178 void lde_gc_stop_timer(void);
181 struct l2vpn
*l2vpn_new(const char *);
182 struct l2vpn
*l2vpn_find(struct ldpd_conf
*, const char *);
183 void l2vpn_del(struct l2vpn
*);
184 void l2vpn_init(struct l2vpn
*);
185 void l2vpn_exit(struct l2vpn
*);
186 struct l2vpn_if
*l2vpn_if_new(struct l2vpn
*, struct kif
*);
187 struct l2vpn_if
*l2vpn_if_find(struct l2vpn
*, unsigned int);
188 struct l2vpn_if
*l2vpn_if_find_name(struct l2vpn
*, const char *);
189 struct l2vpn_pw
*l2vpn_pw_new(struct l2vpn
*, struct kif
*);
190 struct l2vpn_pw
*l2vpn_pw_find(struct l2vpn
*, unsigned int);
191 struct l2vpn_pw
*l2vpn_pw_find_name(struct l2vpn
*, const char *);
192 void l2vpn_pw_init(struct l2vpn_pw
*);
193 void l2vpn_pw_exit(struct l2vpn_pw
*);
194 void l2vpn_pw_reset(struct l2vpn_pw
*);
195 int l2vpn_pw_ok(struct l2vpn_pw
*, struct fec_nh
*);
196 int l2vpn_pw_negotiate(struct lde_nbr
*, struct fec_node
*,
198 void l2vpn_send_pw_status(uint32_t, uint32_t, struct fec
*);
199 void l2vpn_recv_pw_status(struct lde_nbr
*, struct notify_msg
*);
200 void l2vpn_sync_pws(int, union ldpd_addr
*);
201 void l2vpn_pw_ctl(pid_t
);
202 void l2vpn_binding_ctl(pid_t
);