diff options
author | Michele Marchetto <michele@cvs.openbsd.org> | 2009-06-01 20:59:46 +0000 |
---|---|---|
committer | Michele Marchetto <michele@cvs.openbsd.org> | 2009-06-01 20:59:46 +0000 |
commit | 5de1d23aeb3294b99aea577259871a4a7686e9b4 (patch) | |
tree | cc434b947408b0844b7b33a08358359751c9a7e4 /usr.sbin/ldpd/ldpd.h | |
parent | 19268a0235511684a7ee9e71b0c3dd8170ff3762 (diff) |
Welcome ldpd, the Label Distribution Protocol daemon.
Built using the imsg/three process framework, its main aim
is to redistribute MPLS labels between peers.
Right now it has some really basic functionalities,
the basic protocol works and peers are able to exchange
labels and insert them in the kernel.
It still does not react to changes of topology.
Not yet connected to the builds.
ok claudio@ deraadt@
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_ */ |