/* $OpenBSD: ldpe.h,v 1.2 2009/06/05 22:34:45 michele Exp $ */ /* * Copyright (c) 2004, 2005, 2008 Esben Norby * * 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 _LDPE_H_ #define _LDPE_H_ #define max(x,y) ((x) > (y) ? (x) : (y)) #include #include #include #include #include TAILQ_HEAD(ctl_conns, ctl_conn) ctl_conns; struct mapping_entry { TAILQ_ENTRY(mapping_entry) entry; u_int32_t label; u_int32_t prefix; u_int8_t prefixlen; }; struct nbr { LIST_ENTRY(nbr) entry, hash; struct bufferevent *bev; struct event inactivity_timer; struct event keepalive_timer; struct event keepalive_timeout; struct event initdelay_timer; struct mapping_head mapping_list; struct mapping_head withdraw_list; struct mapping_head request_list; struct mapping_head release_list; struct mapping_head abortreq_list; int fd; struct in_addr addr; struct in_addr id; struct iface *iface; time_t uptime; u_int32_t peerid; /* unique ID in DB */ int state; u_int16_t lspace; u_int16_t holdtime; u_int16_t keepalive; u_int8_t priority; u_int8_t options; u_int8_t flags; u_int8_t hello_type; }; /* hello.c */ int send_hello(struct iface *); void recv_hello(struct iface *, struct in_addr, char *, u_int16_t); /* init.c */ int send_init(struct nbr *); int recv_init(struct nbr *, char *, u_int16_t); /* keepalive.c */ int send_keepalive(struct nbr *); int recv_keepalive(struct nbr *, char *, u_int16_t); /* notification.c */ int send_notification(u_int32_t, struct iface *, int, u_int32_t, u_int32_t); int send_notification_nbr(struct nbr *, u_int32_t, u_int32_t, u_int32_t); int recv_notification(struct nbr *, char *, u_int16_t); /* address.c */ int send_address(struct nbr *, struct iface *); int recv_address(struct nbr *, char *, u_int16_t); int send_address_withdraw(struct nbr *, struct iface *); int recv_address_withdraw(struct nbr *, char *, u_int16_t); /* labelmapping.c */ int send_labelmapping(struct nbr *); int recv_labelmapping(struct nbr *, char *, u_int16_t); int send_labelrequest(struct nbr *); int recv_labelrequest(struct nbr *, char *, u_int16_t); int send_labelwithdraw(struct nbr *); int recv_labelwithdraw(struct nbr *, char *, u_int16_t); int send_labelrelease(struct nbr *); int recv_labelrelease(struct nbr *, char *, u_int16_t); int send_labelabortreq(struct nbr *); int recv_labelabortreq(struct nbr *, char *, u_int16_t); /* ldpe.c */ pid_t ldpe(struct ldpd_conf *, int[2], int[2], int[2]); void ldpe_dispatch_main(int, short, void *); void ldpe_dispatch_lde(int, short, void *); int ldpe_imsg_compose_parent(int, pid_t, void *, u_int16_t); int ldpe_imsg_compose_lde(int, u_int32_t, pid_t, void *, u_int16_t); u_int32_t ldpe_router_id(void); void ldpe_fib_update(int); void ldpe_iface_ctl(struct ctl_conn *, unsigned int); void ldpe_nbr_ctl(struct ctl_conn *); /* interface.c */ int if_fsm(struct iface *, enum iface_event); struct iface *if_new(struct kif *, struct kif_addr *); void if_del(struct iface *); void if_init(struct ldpd_conf *, struct iface *); 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 *); int if_join_group(struct iface *, struct in_addr *); int if_leave_group(struct iface *, struct in_addr *); int if_set_mcast(struct iface *); int if_set_recvif(int, int); void if_set_recvbuf(int); int if_set_mcast_loop(int); int if_set_mcast_ttl(int, u_int8_t); int if_set_tos(int, int); int if_set_reuse(int, int); int if_set_nonblock(int); /* neighbor.c */ void nbr_init(u_int32_t); struct nbr *nbr_new(u_int32_t, u_int16_t, struct iface *, int); void nbr_del(struct nbr *); struct nbr *nbr_find_ip(struct iface *, u_int32_t); struct nbr *nbr_find_ldpid(struct iface *, u_int32_t, u_int16_t); struct nbr *nbr_find_peerid(u_int32_t); int nbr_fsm(struct nbr *, enum nbr_event); void nbr_itimer(int, short, void *); void nbr_start_itimer(struct nbr *); void nbr_stop_itimer(struct nbr *); void nbr_reset_itimer(struct nbr *); void nbr_ktimer(int, short, void *); void nbr_start_ktimer(struct nbr *); void nbr_stop_ktimer(struct nbr *); void nbr_reset_ktimer(struct nbr *); void nbr_ktimeout(int, short, void *); void nbr_start_ktimeout(struct nbr *); void nbr_stop_ktimeout(struct nbr *); void nbr_reset_ktimeout(struct nbr *); void nbr_idtimer(int, short, void *); void nbr_start_idtimer(struct nbr *); void nbr_stop_idtimer(struct nbr *); void nbr_reset_idtimer(struct nbr *); int nbr_pending_idtimer(struct nbr *); int nbr_act_reset_itimer(struct nbr *); int nbr_act_start_itimer(struct nbr *); int nbr_act_reset_ktimer(struct nbr *); int nbr_act_start_ktimer(struct nbr *); int nbr_act_reset_ktimeout(struct nbr *); int nbr_act_start_ktimeout(struct nbr *); int nbr_act_reset_idtimer(struct nbr *); int nbr_act_start_idtimer(struct nbr *); int nbr_act_session_establish(struct nbr *, int); int nbr_close_connection(struct nbr *); void nbr_mapping_add(struct nbr *, struct mapping_head *, struct map *); struct mapping_entry *nbr_mapping_find(struct nbr *, struct mapping_head *, struct map *); void nbr_mapping_del(struct nbr *, struct mapping_head *, struct map *); void nbr_mapping_list_clr(struct nbr *, struct mapping_head *); struct ctl_nbr *nbr_to_ctl(struct nbr *); /* packet.c */ int gen_ldp_hdr(struct buf *, struct iface *, u_int16_t); int gen_msg_tlv(struct buf *, u_int32_t, u_int16_t); int send_packet(struct iface *, void *, size_t, struct sockaddr_in *); void disc_recv_packet(int, short, void *); void session_recv_packet(int, short, void *); void session_read(struct bufferevent *, void *); void session_error(struct bufferevent *, short, void *); void session_close(struct nbr *); void session_shutdown(struct nbr *, u_int32_t, u_int32_t, u_int32_t); char *pkt_ptr; /* packet buffer */ #endif /* _LDPE_H_ */