diff options
Diffstat (limited to 'usr.sbin/ldpd/ldpd.h')
-rw-r--r-- | usr.sbin/ldpd/ldpd.h | 494 |
1 files changed, 494 insertions, 0 deletions
diff --git a/usr.sbin/ldpd/ldpd.h b/usr.sbin/ldpd/ldpd.h new file mode 100644 index 00000000000..3e76e53c1fb --- /dev/null +++ b/usr.sbin/ldpd/ldpd.h @@ -0,0 +1,494 @@ +/* $OpenBSD: ldpd.h,v 1.1 2009/06/01 20:59:45 michele Exp $ */ + +/* + * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org> + * Copyright (c) 2004 Esben Norby <norby@openbsd.org> + * Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org> + * + * 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 _LDPD_H_ +#define _LDPD_H_ + +#include <sys/queue.h> +#include <sys/socket.h> +#include <sys/time.h> +#include <sys/tree.h> +#include <md5.h> +#include <net/if.h> +#include <netinet/in.h> +#include <event.h> + +#include "ldp.h" + +#define CONF_FILE "/etc/ldpd.conf" +#define LDPD_SOCKET "/var/run/ldpd.sock" +#define LDPD_USER "_ldpd" + +#define NBR_HASHSIZE 128 + +#define NBR_IDSELF 1 +#define NBR_CNTSTART (NBR_IDSELF + 1) + +#define READ_BUF_SIZE 65535 +#define RT_BUF_SIZE 16384 +#define MAX_RTSOCK_BUF 128 * 1024 +#define LDP_BACKLOG 128 + +#define LDPD_FLAG_NO_LFIB_UPDATE 0x0001 + +#define F_LDPD_INSERTED 0x0001 +#define F_KERNEL 0x0002 +#define F_BGPD_INSERTED 0x0004 +#define F_CONNECTED 0x0008 +#define F_DOWN 0x0010 +#define F_STATIC 0x0020 +#define F_DYNAMIC 0x0040 +#define F_REDISTRIBUTED 0x0100 + +/* buffer */ +struct buf { + TAILQ_ENTRY(buf) entry; + u_char *buf; + size_t size; + size_t max; + size_t wpos; + size_t rpos; +}; + +struct msgbuf { + TAILQ_HEAD(, buf) bufs; + u_int32_t queued; + int fd; +}; + +#define IMSG_HEADER_SIZE sizeof(struct imsg_hdr) +#define MAX_IMSGSIZE 8192 + +struct buf_read { + u_char buf[READ_BUF_SIZE]; + u_char *rptr; + size_t wpos; +}; + +struct imsgbuf { + TAILQ_HEAD(, imsg_fd) fds; + struct buf_read r; + struct msgbuf w; + struct event ev; + void (*handler)(int, short, void *); + int fd; + pid_t pid; + short events; +}; + +enum imsg_type { + IMSG_NONE, + IMSG_CTL_RELOAD, + IMSG_CTL_SHOW_INTERFACE, + IMSG_CTL_SHOW_NBR, + IMSG_CTL_SHOW_LIB, + IMSG_CTL_LFIB_COUPLE, + IMSG_CTL_LFIB_DECOUPLE, + IMSG_CTL_KROUTE, + IMSG_CTL_KROUTE_ADDR, + IMSG_CTL_IFINFO, + IMSG_CTL_END, + IMSG_KLABEL_INSERT, + IMSG_KLABEL_CHANGE, + IMSG_KLABEL_DELETE, + IMSG_KROUTE_GET, + IMSG_IFINFO, + IMSG_LABEL_MAPPING, + IMSG_LABEL_MAPPING_FULL, + IMSG_LABEL_REQUEST, + IMSG_REQUEST_ADD, + IMSG_REQUEST_ADD_END, + IMSG_MAPPING_ADD, + IMSG_MAPPING_ADD_END, + IMSG_RELEASE_ADD, + IMSG_RELEASE_ADD_END, + IMSG_ADDRESS_ADD, + IMSG_ADDRESS_DEL, + IMSG_NOTIFICATION_SEND, + IMSG_NEIGHBOR_UP, + IMSG_NEIGHBOR_DOWN, + IMSG_NEIGHBOR_CHANGE, + IMSG_NETWORK_ADD, + IMSG_NETWORK_DEL, + IMSG_RECONF_CONF, + IMSG_RECONF_AREA, + IMSG_RECONF_IFACE, + IMSG_RECONF_END +}; + +struct imsg_hdr { + enum imsg_type type; + u_int16_t len; + u_int32_t peerid; + pid_t pid; +}; + +struct imsg { + struct imsg_hdr hdr; + void *data; +}; + +/* interface states */ +#define IF_STA_NEW 0x00 /* dummy state for reload */ +#define IF_STA_DOWN 0x01 +#define IF_STA_LOOPBACK 0x02 +#define IF_STA_POINTTOPOINT 0x04 +#define IF_STA_DROTHER 0x08 +#define IF_STA_MULTI (IF_STA_DROTHER | IF_STA_BACKUP | IF_STA_DR) +#define IF_STA_ANY 0x7f +#define IF_STA_ACTIVE (~IF_STA_DOWN) + +/* interface events */ +enum iface_event { + IF_EVT_NOTHING, + IF_EVT_UP, + IF_EVT_DOWN +}; + +/* interface actions */ +enum iface_action { + IF_ACT_NOTHING, + IF_ACT_STRT, + IF_ACT_RST +}; + +/* interface types */ +enum iface_type { + IF_TYPE_POINTOPOINT, + IF_TYPE_BROADCAST, + IF_TYPE_NBMA, + IF_TYPE_POINTOMULTIPOINT, + IF_TYPE_VIRTUALLINK +}; + +/* neighbor states */ +#define NBR_STA_DOWN 0x0001 +#define NBR_STA_PRESENT 0x0002 +#define NBR_STA_INITIAL 0x0004 +#define NBR_STA_OPENREC 0x0008 +#define NBR_STA_OPENSENT 0x0010 +#define NBR_STA_OPER 0x0020 +#define NBR_STA_ACTIVE (~NBR_STA_DOWN) +#define NBR_STA_SESSION (NBR_STA_PRESENT | NBR_STA_PRESENT | \ + NBR_STA_INITIAL | NBR_STA_OPENREC | \ + NBR_STA_OPER | NBR_STA_OPENSENT | \ + NBR_STA_ACTIVE) +#define NBR_STA_UP (NBR_STA_PRESENT | NBR_STA_SESSION) + +/* neighbor events */ +enum nbr_event { + NBR_EVT_NOTHING, + NBR_EVT_HELLO_RCVD, + NBR_EVT_SESSION_UP, + NBR_EVT_CLOSE_SESSION, + NBR_EVT_INIT_RCVD, + NBR_EVT_KEEPALIVE_RCVD, + NBR_EVT_PDU_RCVD, + NBR_EVT_INIT_SENT, + NBR_EVT_DOWN +}; + +/* neighbor actions */ +enum nbr_action { + NBR_ACT_NOTHING, + NBR_ACT_STRT_ITIMER, + NBR_ACT_RST_ITIMER, + NBR_ACT_RST_KTIMEOUT, + NBR_ACT_STRT_KTIMER, + NBR_ACT_RST_KTIMER, + NBR_ACT_SESSION_EST, + NBR_ACT_INIT_SEND, + NBR_ACT_KEEPALIVE_SEND, + NBR_ACT_CLOSE_SESSION +}; + +TAILQ_HEAD(mapping_head, mapping_entry); + +struct map { + u_int32_t label; + u_int32_t prefix; + u_int8_t prefixlen; + u_int32_t messageid; +}; + +struct iface { + LIST_ENTRY(iface) entry; + struct event hello_timer; + + LIST_HEAD(, nbr) nbr_list; + LIST_HEAD(, lde_nbr) lde_nbr_list; + + char name[IF_NAMESIZE]; + struct in_addr addr; + struct in_addr dst; + struct in_addr mask; + struct nbr *self; + + u_int16_t lspace_id; + + u_int64_t baudrate; + time_t uptime; + unsigned int ifindex; + int discovery_fd; + int session_fd; + int state; + int mtu; + u_int16_t holdtime; + u_int16_t keepalive; + u_int16_t hello_interval; + u_int16_t flags; + enum iface_type type; + u_int8_t media_type; + u_int8_t linkstate; + u_int8_t priority; + u_int8_t passive; +}; + +/* ldp_conf */ +enum { + PROC_MAIN, + PROC_LDP_ENGINE, + PROC_LDE_ENGINE +} ldpd_process; + +#define MODE_DIST_INDEPENDENT 0x01 +#define MODE_DIST_ORDERED 0x02 +#define MODE_RET_LIBERAL 0x04 +#define MODE_RET_CONSERVATIVE 0x08 +#define MODE_ADV_ONDEMAND 0x10 +#define MODE_ADV_UNSOLICITED 0x20 + +struct ldpd_conf { + struct event disc_ev, sess_ev; + struct in_addr rtr_id; + LIST_HEAD(, iface) iface_list; + + u_int32_t opts; +#define LDPD_OPT_VERBOSE 0x00000001 +#define LDPD_OPT_VERBOSE2 0x00000002 +#define LDPD_OPT_NOACTION 0x00000004 + time_t uptime; + int ldp_discovery_socket; + int ldp_session_socket; + int flags; + u_int8_t mode; +}; + +/* kroute */ +struct kroute { + struct in_addr prefix; + struct in_addr nexthop; + u_int32_t local_label; + u_int32_t remote_label; + u_int16_t flags; + u_int16_t rtlabel; + u_int32_t ext_tag; + u_short ifindex; + u_int8_t prefixlen; +}; + +struct rroute { + struct kroute kr; + u_int32_t metric; +}; + +struct kif_addr { + TAILQ_ENTRY(kif_addr) entry; + struct in_addr addr; + struct in_addr mask; + struct in_addr dstbrd; +}; + +struct kif { + char ifname[IF_NAMESIZE]; + u_int64_t baudrate; + int flags; + int mtu; + u_short ifindex; + u_int8_t media_type; + u_int8_t link_state; + u_int8_t nh_reachable; /* for nexthop verification */ +}; + +/* name2id */ +struct n2id_label { + TAILQ_ENTRY(n2id_label) entry; + char *name; + u_int16_t id; + u_int32_t ext_tag; + int ref; +}; + +TAILQ_HEAD(n2id_labels, n2id_label); +extern struct n2id_labels rt_labels; + +/* control data structures */ +struct ctl_iface { + char name[IF_NAMESIZE]; + struct in_addr addr; + struct in_addr mask; + struct in_addr lspace; + struct in_addr rtr_id; + struct in_addr dr_id; + struct in_addr dr_addr; + struct in_addr bdr_id; + struct in_addr bdr_addr; + time_t hello_timer; + time_t uptime; + u_int64_t baudrate; + unsigned int ifindex; + int state; + int mtu; + int nbr_cnt; + int adj_cnt; + u_int16_t flags; + u_int16_t holdtime; + u_int16_t hello_interval; + enum iface_type type; + u_int8_t linkstate; + u_int8_t mediatype; + u_int8_t priority; + u_int8_t passive; +}; + +struct ctl_nbr { + char name[IF_NAMESIZE]; + struct in_addr id; + struct in_addr addr; + struct in_addr dr; + struct in_addr bdr; + struct in_addr lspace; + time_t dead_timer; + time_t uptime; + u_int32_t db_sum_lst_cnt; + u_int32_t ls_req_lst_cnt; + u_int32_t ls_retrans_lst_cnt; + u_int32_t state_chng_cnt; + int nbr_state; + int iface_state; + u_int8_t priority; + u_int8_t options; +}; + +struct ctl_rt { + struct in_addr prefix; + struct in_addr nexthop; + struct in_addr lspace; + struct in_addr adv_rtr; + time_t uptime; + u_int8_t flags; + u_int8_t prefixlen; + u_int32_t local_label; + u_int32_t remote_label; +}; + +struct ctl_sum { + struct in_addr rtr_id; + u_int32_t spf_delay; + u_int32_t spf_hold_time; + u_int32_t num_ext_lsa; + u_int32_t num_lspace; + time_t uptime; + u_int8_t rfc1583compat; +}; + +struct ctl_sum_lspace { + struct in_addr lspace; + u_int32_t num_iface; + u_int32_t num_adj_nbr; + u_int32_t num_spf_calc; + u_int32_t num_lsa; +}; + +/* buffer.c */ +struct buf *buf_open(size_t); +struct buf *buf_dynamic(size_t, size_t); +int buf_add(struct buf *, void *, size_t); +void *buf_reserve(struct buf *, size_t); +void *buf_seek(struct buf *, size_t, size_t); +int buf_close(struct msgbuf *, struct buf *); +void buf_free(struct buf *); +void msgbuf_init(struct msgbuf *); +void msgbuf_clear(struct msgbuf *); +int msgbuf_write(struct msgbuf *); + +/* parse.y */ +struct ldpd_conf *parse_config(char *, int); +int cmdline_symset(char *); + +/* imsg.c */ +void imsg_init(struct imsgbuf *, int, void (*)(int, short, void *)); +ssize_t imsg_read(struct imsgbuf *); +ssize_t imsg_get(struct imsgbuf *, struct imsg *); +int imsg_compose(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t, + void *, u_int16_t); +struct buf *imsg_create(struct imsgbuf *, enum imsg_type, u_int32_t, pid_t, + u_int16_t); +int imsg_add(struct buf *, void *, u_int16_t); +int imsg_close(struct imsgbuf *, struct buf *); +void imsg_free(struct imsg *); +void imsg_event_add(struct imsgbuf *); /* needs to be provided externally */ + +/* in_cksum.c */ +u_int16_t in_cksum(void *, size_t); + +/* iso_cksum.c */ +u_int16_t iso_cksum(void *, u_int16_t, u_int16_t); + +/* kroute.c */ +int kif_init(void); +int kr_init(int); +int kr_change(struct kroute *, int); +int kr_delete(struct kroute *); +void kr_shutdown(void); +void kr_lfib_couple(void); +void kr_lfib_decouple(void); +void kr_dispatch_msg(int, short, void *); +void kr_show_route(struct imsg *); +void kr_ifinfo(char *, pid_t); +struct kif *kif_findname(char *, struct in_addr, struct kif_addr **); +void kr_reload(void); +int kroute_insert_label(struct kroute *); + +u_int8_t mask2prefixlen(in_addr_t); +in_addr_t prefixlen2mask(u_int8_t); + +/* log.h */ +const char *nbr_state_name(int); +const char *if_state_name(int); +const char *if_type_name(enum iface_type); + +/* name2id.c */ +u_int16_t rtlabel_name2id(const char *); +const char *rtlabel_id2name(u_int16_t); +void rtlabel_unref(u_int16_t); +u_int32_t rtlabel_id2tag(u_int16_t); +u_int16_t rtlabel_tag2id(u_int32_t); +void rtlabel_tag(u_int16_t, u_int32_t); + +/* ldpd.c */ +void main_imsg_compose_ldpe(int, pid_t, void *, u_int16_t); +void main_imsg_compose_lde(int, pid_t, void *, u_int16_t); +void merge_config(struct ldpd_conf *, struct ldpd_conf *); + +/* printconf.c */ +void print_config(struct ldpd_conf *); + +#endif /* _LDPD_H_ */ |