void send_address_withdraw(struct nbr *nbr, struct iface *iface) { struct ibuf *buf; u_int16_t size; if (nbr->iface->passive) return; log_debug("send_address_withdraw: neighbor ID %s", inet_ntoa(nbr->id)); if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) fatal("send_address_withdraw"); /* XXX: multiple address on the same iface? */ size = LDP_HDR_SIZE + sizeof(struct ldp_msg) + sizeof(struct in_addr); gen_ldp_hdr(buf, nbr->iface, size); size -= LDP_HDR_SIZE; gen_msg_tlv(buf, MSG_TYPE_ADDRWITHDRAW, size); size -= sizeof(struct ldp_msg); gen_address_list_tlv(buf, iface, size); evbuf_enqueue(&nbr->wbuf, buf); }
void send_init(struct nbr *nbr) { struct ibuf *buf; u_int16_t size; log_debug("send_init: neighbor ID %s", inet_ntoa(nbr->id)); if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) fatal("send_init"); size = LDP_HDR_SIZE + sizeof(struct ldp_msg) + SESS_PRMS_SIZE; gen_ldp_hdr(buf, size); size -= LDP_HDR_SIZE; gen_msg_tlv(buf, MSG_TYPE_INIT, size); size -= sizeof(struct ldp_msg); gen_init_prms_tlv(buf, nbr, size); evbuf_enqueue(&nbr->tcp->wbuf, buf); }
void send_keepalive(struct nbr *nbr) { struct ibuf *buf; u_int16_t size; if (nbr->iface->passive) return; if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) fatal("send_keepalive"); size = LDP_HDR_SIZE + sizeof(struct ldp_msg); gen_ldp_hdr(buf, nbr->iface, size); size -= LDP_HDR_SIZE; gen_msg_tlv(buf, MSG_TYPE_KEEPALIVE, size); evbuf_enqueue(&nbr->wbuf, buf); }
void send_address(struct nbr *nbr, struct iface *iface) { struct ibuf *buf; struct iface *niface; u_int16_t size, iface_count = 0; if (nbr->iface->passive) return; log_debug("send_address: neighbor ID %s", inet_ntoa(nbr->id)); if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) fatal("send_address"); /* XXX: multiple address on the same iface? */ if (iface == NULL) LIST_FOREACH(niface, &leconf->iface_list, entry) iface_count++; else iface_count = 1; size = LDP_HDR_SIZE + sizeof(struct ldp_msg) + sizeof(struct address_list_tlv) + iface_count * sizeof(struct in_addr); gen_ldp_hdr(buf, nbr->iface, size); size -= LDP_HDR_SIZE; gen_msg_tlv(buf, MSG_TYPE_ADDR, size); size -= sizeof(struct ldp_msg); gen_address_list_tlv(buf, iface, size); evbuf_enqueue(&nbr->wbuf, buf); }
int send_hello(struct iface *iface) { struct sockaddr_in dst; struct ibuf *buf; u_int16_t size; dst.sin_port = htons(LDP_PORT); dst.sin_family = AF_INET; dst.sin_len = sizeof(struct sockaddr_in); inet_aton(AllRouters, &dst.sin_addr); if (iface->passive) return (0); if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) fatal("send_hello"); size = LDP_HDR_SIZE + sizeof(struct ldp_msg) + sizeof(struct hello_prms_tlv); gen_ldp_hdr(buf, iface, size); size -= LDP_HDR_SIZE; gen_msg_tlv(buf, MSG_TYPE_HELLO, size); size -= sizeof(struct ldp_msg); gen_hello_prms_tlv(iface, buf, size); send_packet(iface, buf->buf, buf->wpos, &dst); ibuf_free(buf); return (0); }
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); }