summaryrefslogtreecommitdiff
path: root/usr.sbin/ldpd/ldpd.h
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/ldpd/ldpd.h')
-rw-r--r--usr.sbin/ldpd/ldpd.h494
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_ */