mrt
int i, j, msr, mrt;
mrt = mtrr2mrt(msrv & 0xff);
if (mrt == MDF_UNKNOWN)
mrt = MDF_UNCACHEABLE;
mrt | MDF_ACTIVE;
mrt = mtrr2mrt(msrv & 0xff);
if (mrt == MDF_UNKNOWN)
mrt = MDF_UNCACHEABLE;
mrt | MDF_ACTIVE;
mrt = mtrr2mrt(msrv & 0xff);
if (mrt == MDF_UNKNOWN)
mrt = MDF_UNCACHEABLE;
mrt | MDF_ACTIVE;
mrt = mtrr2mrt(msrv & 0xff);
if (mrt == MDF_UNKNOWN)
mrt = MDF_UNCACHEABLE;
mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) | mrt;
int i, j, msr, mrt;
mrt = mtrr2mrt(msrv & 0xff);
if (mrt == MDF_UNKNOWN)
mrt = MDF_UNCACHEABLE;
mrt | MDF_ACTIVE;
mrt = mtrr2mrt(msrv & 0xff);
if (mrt == MDF_UNKNOWN)
mrt = MDF_UNCACHEABLE;
mrt | MDF_ACTIVE;
mrt = mtrr2mrt(msrv & 0xff);
if (mrt == MDF_UNKNOWN)
mrt = MDF_UNCACHEABLE;
mrt | MDF_ACTIVE;
mrt = mtrr2mrt(msrv & 0xff);
if (mrt == MDF_UNKNOWN)
mrt = MDF_UNCACHEABLE;
mrd->mr_flags = (mrd->mr_flags & ~MDF_ATTRMASK) | mrt;
struct rtentry *mrt;
mrt = rt;
while ((mrt = SMR_PTR_GET(&mrt->rt_next)) != NULL) {
if (mrt->rt_priority == prio)
mrt = rt;
if (mrt->rt_priority == prio) {
rt = mrt;
mrt = SMR_PTR_GET(&mrt->rt_next);
if (mrt == NULL)
struct rtentry *mrt;
for (mrt = SMR_PTR_GET_LOCKED(&an->an_value);
mrt != NULL;
mrt = SMR_PTR_GET_LOCKED(&mrt->rt_next)) {
(mrt->rt_priority & RTP_MASK) != (prio & RTP_MASK))
(mrt->rt_gateway->sa_len == gateway->sa_len &&
memcmp(mrt->rt_gateway, gateway,
for (mrt = SMR_PTR_GET_LOCKED(&an->an_value);
mrt != NULL;
mrt = SMR_PTR_GET_LOCKED(&mrt->rt_next)) {
if ((mrt->rt_priority & RTP_MASK) !=
SET(mrt->rt_flags, RTF_MPATH);
struct rtentry *mrt;
while ((mrt = SMR_PTR_GET_LOCKED(prt)) != NULL) {
if (mrt == rt) {
SMR_PTR_GET_LOCKED(&mrt->rt_next));
} else if ((mrt->rt_priority & RTP_MASK) ==
nrt = mrt;
prt = &mrt->rt_next;
struct rtentry *mrt;
while ((mrt = SMR_PTR_GET_LOCKED(prt)) != NULL) {
if (mrt == rt)
prt = &mrt->rt_next;
KASSERT(mrt != NULL);
struct rtentry *mrt, **prt;
while ((mrt = SMR_PTR_GET_LOCKED(prt)) != NULL) {
if (mrt->rt_priority > prio)
prt = &mrt->rt_next;
SMR_PTR_SET_LOCKED(&rt->rt_next, mrt);
timeout = mrt_timeout(conf->mrt, timeout);
mrt_handler(conf->mrt);
mrt_reconfigure(conf->mrt);
LIST_ENTRY(mrt) entry;
struct mrt conf;
void mrt_write(struct mrt *);
void mrt_clean(struct mrt *);
struct mrt *mrt_get(struct mrt_head *, struct mrt *);
struct mrt_head *mrt;
LIST_HEAD(mrt_head, mrt);
struct mrt *m;
while ((m = LIST_FIRST(conf->mrt)) != NULL) {
free(conf->mrt);
mrt_mergeconfig(xconf->mrt, conf->mrt);
if ((conf->mrt = calloc(1, sizeof(struct mrt_head))) == NULL)
LIST_INIT(conf->mrt);
mrt_write(struct mrt *mrt)
if (ibuf_write(mrt->fd, mrt->wbuf) == -1) {
mrt_clean(mrt);
mrt_done(mrt);
mrt_clean(struct mrt *mrt)
close(mrt->fd);
msgbuf_free(mrt->wbuf);
mrt->wbuf = NULL;
mrt_open(struct mrt *mrt)
if (strftime(MRT2MC(mrt)->file, sizeof(MRT2MC(mrt)->file),
MRT2MC(mrt)->name, localtime(&now)) == 0) {
fd = open(MRT2MC(mrt)->file,
log_warn("mrt_open %s", MRT2MC(mrt)->file);
if (mrt->state == MRT_STATE_OPEN)
if (imsg_compose(mrt_imsgbuf[TYPE2IDX(mrt->type)], type, 0, 0, fd,
mrt, sizeof(struct mrt)) == -1)
mrt_timeout(struct mrt_head *mrt, monotime_t timeout)
struct mrt *m;
LIST_FOREACH(m, mrt, entry) {
mrt_reconfigure(struct mrt_head *mrt)
struct mrt *m, *xm;
LIST_FOREACH_SAFE(m, mrt, entry, xm) {
IMSG_MRT_CLOSE, 0, 0, -1, m, sizeof(struct mrt)) ==
mrt_handler(struct mrt_head *mrt)
struct mrt *m;
LIST_FOREACH(m, mrt, entry) {
struct mrt *
mrt_get(struct mrt_head *c, struct mrt *m)
struct mrt *t;
struct mrt *m, *xm;
mrt_bgp_msg_subtype(struct mrt *mrt, struct ibuf *pkg, struct peer *peer,
mrt_dump_bgp_msg(struct mrt *mrt, struct ibuf *pkg, struct peer *peer,
if (mrt->type == MRT_ALL_IN || mrt->type == MRT_UPDATE_IN)
subtype = mrt_bgp_msg_subtype(mrt, pkg, peer, msgtype, in);
ibuf_close(mrt->wbuf, buf);
mrt_dump_state(struct mrt *mrt, struct peer *peer)
ibuf_close(mrt->wbuf, buf);
mrt_dump_entry_mp(struct mrt *mrt, struct prefix *p, uint16_t snum,
static int mrt_dump_entry_mp(struct mrt *, struct prefix *, uint16_t,
static int mrt_dump_entry(struct mrt *, struct prefix *, uint16_t,
static int mrt_dump_entry_v2(struct mrt *, struct rib_entry *, uint32_t);
static int mrt_open(struct mrt *);
ibuf_close(mrt->wbuf, hbuf);
ibuf_close(mrt->wbuf, h2buf);
ibuf_close(mrt->wbuf, buf);
mrt_dump_entry(struct mrt *mrt, struct prefix *p, uint16_t snum,
ibuf_close(mrt->wbuf, hbuf);
ibuf_close(mrt->wbuf, buf);
mrt_dump_entry_v2(struct mrt *mrt, struct rib_entry *re, uint32_t snum)
ibuf_close(mrt->wbuf, hbuf);
ibuf_close(mrt->wbuf, nbuf);
ibuf_close(mrt->wbuf, hbuf);
ibuf_close(mrt->wbuf, apbuf);
mrt_dump_v2_hdr(struct mrt *mrt, struct bgpd_config *conf)
nlen = strlen(mrt->rib);
if (ibuf_add(buf, mrt->rib, nlen) == -1)
ibuf_close(mrt->wbuf, hbuf);
ibuf_close(mrt->wbuf, buf);
struct mrt *mrtbuf = ptr;
mrt_done(struct mrt *mrtbuf)
struct mrt *m, *n;
LIST_FOREACH(m, conf->mrt, entry) {
LIST_INSERT_HEAD(conf->mrt, n, entry);
struct mrt *m;
if (conf->mrt == NULL)
LIST_FOREACH(m, conf->mrt, entry)
if (!LIST_EMPTY(conf->mrt))
struct mrt mrt;
if (msgbuf_queuelen(mctx->mrt.wbuf) > 0) {
pfd[i].fd = mctx->mrt.fd;
} else if (mctx->mrt.state == MRT_STATE_REMOVE) {
mrt_clean(&mctx->mrt);
if (pfd[j].fd == mctx->mrt.fd &&
mrt_write(&mctx->mrt);
struct mrt *mrt = arg;
return (msgbuf_queuelen(mrt->wbuf) > SESS_MSG_LOW_MARK);
rde_dump_mrt_new(struct mrt *mrt, pid_t pid, int fd)
memcpy(&ctx->mrt, mrt, sizeof(struct mrt));
if ((ctx->mrt.wbuf = msgbuf_new()) == NULL) {
ctx->mrt.fd = fd;
ctx->mrt.state = MRT_STATE_RUNNING;
rid = rib_find(ctx->mrt.rib);
log_warnx("non existing RIB %s for mrt dump", ctx->mrt.rib);
if (ctx->mrt.type == MRT_TABLE_DUMP_V2)
mrt_dump_v2_hdr(&ctx->mrt, conf);
if (rib_dump_new(rid, AID_UNSPEC, CTL_MSG_HIGH_MARK, &ctx->mrt,
mrt_clean(&mctx->mrt);
void rde_dump_mrt_new(struct mrt *, pid_t, int);
struct mrt xmrt;
int mrt_dump_v2_hdr(struct mrt *, struct bgpd_config *);
struct mrt *mrt;
LIST_FOREACH(mrt, &mrthead, entry) {
if (mrt->type != MRT_ALL_IN && mrt->type != MRT_ALL_OUT)
if ((mrt->peer_id == 0 && mrt->group_id == 0) ||
mrt->peer_id == p->conf.id || (mrt->group_id != 0 &&
mrt->group_id == p->conf.groupid))
mrt_dump_state(mrt, p);
struct mrt *mrt;
LIST_FOREACH(mrt, &mrthead, entry) {
if (mrt->type != MRT_ALL_IN &&
(mrt->type != MRT_UPDATE_IN ||
if (mrt->type != MRT_ALL_OUT &&
(mrt->type != MRT_UPDATE_OUT ||
if ((mrt->peer_id == 0 && mrt->group_id == 0) ||
mrt->peer_id == p->conf.id || (mrt->group_id != 0 &&
mrt->group_id == p->conf.groupid))
mrt_dump_bgp_msg(mrt, msg, p, msgtype);
struct mrt xmrt;
struct mrt *mrt;
mrt = mrt_get(&mrthead, &xmrt);
if (mrt == NULL) {
mrt = calloc(1, sizeof(struct mrt));
if (mrt == NULL)
memcpy(mrt, &xmrt, sizeof(struct mrt));
if ((mrt->wbuf = msgbuf_new()) == NULL)
LIST_INSERT_HEAD(&mrthead, mrt, entry);
close(mrt->fd);
mrt->fd = xmrt.fd;
mrt = mrt_get(&mrthead, &xmrt);
if (mrt != NULL)
mrt_done(mrt);
struct mrt *m, *xm, **mrt_l = NULL;
sizeof(struct mrt *))) == NULL) {
void mrt_dump_bgp_msg(struct mrt *, struct ibuf *, struct peer *,
void mrt_dump_state(struct mrt *, struct peer *);
void mrt_done(struct mrt *);