void send_notification_full(struct tcp_conn *tcp, struct notify_msg *nm) { struct ibuf *buf; uint16_t size; int err = 0; /* calculate size */ size = LDP_HDR_SIZE + LDP_MSG_SIZE + STATUS_SIZE; if (nm->flags & F_NOTIF_PW_STATUS) size += PW_STATUS_TLV_SIZE; if (nm->flags & F_NOTIF_FEC) { size += TLV_HDR_SIZE; switch (nm->fec.type) { case MAP_TYPE_PWID: size += FEC_PWID_ELM_MIN_LEN; if (nm->fec.flags & F_MAP_PW_ID) size += sizeof(uint32_t); break; } } if ((buf = ibuf_open(size)) == NULL) fatal(__func__); err |= gen_ldp_hdr(buf, size); size -= LDP_HDR_SIZE; err |= gen_msg_hdr(buf, MSG_TYPE_NOTIFICATION, size); err |= gen_status_tlv(buf, nm->status_code, nm->msg_id, nm->msg_type); /* optional tlvs */ if (nm->flags & F_NOTIF_PW_STATUS) err |= gen_pw_status_tlv(buf, nm->pw_status); if (nm->flags & F_NOTIF_FEC) err |= gen_fec_tlv(buf, &nm->fec); if (err) { ibuf_free(buf); return; } evbuf_enqueue(&tcp->wbuf, buf); }
struct ibuf * send_notification(u_int32_t status, struct iface *iface, u_int32_t msgid, u_int32_t type) { struct ibuf *buf; u_int16_t size; if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) fatal("send_notification"); size = LDP_HDR_SIZE + sizeof(struct ldp_msg) + STATUS_SIZE; gen_ldp_hdr(buf, iface, size); size -= LDP_HDR_SIZE; gen_msg_tlv(buf, MSG_TYPE_NOTIFICATION, size); size -= sizeof(struct ldp_msg); gen_status_tlv(buf, status, msgid, type); return (buf); }