diff options
-rw-r--r-- | usr.sbin/ldpd/labelmapping.c | 198 | ||||
-rw-r--r-- | usr.sbin/ldpd/ldp.h | 4 | ||||
-rw-r--r-- | usr.sbin/ldpd/ldpe.c | 11 | ||||
-rw-r--r-- | usr.sbin/ldpd/ldpe.h | 8 |
4 files changed, 52 insertions, 169 deletions
diff --git a/usr.sbin/ldpd/labelmapping.c b/usr.sbin/ldpd/labelmapping.c index 8a4fc65344b..82765ed0305 100644 --- a/usr.sbin/ldpd/labelmapping.c +++ b/usr.sbin/ldpd/labelmapping.c @@ -1,4 +1,4 @@ -/* $OpenBSD: labelmapping.c,v 1.27 2013/10/17 17:47:03 renato Exp $ */ +/* $OpenBSD: labelmapping.c,v 1.28 2013/10/17 17:52:20 renato Exp $ */ /* * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org> @@ -48,186 +48,71 @@ int tlv_decode_label(struct nbr *, struct ldp_msg *, char *, u_int16_t, int tlv_decode_fec_elm(struct nbr *, struct ldp_msg *, char *, u_int16_t, u_int8_t *, u_int32_t *, u_int8_t *); -/* Label Mapping Message */ -void -send_labelmapping(struct nbr *nbr) +static void +enqueue_pdu(struct nbr *nbr, struct ibuf *buf, u_int16_t size) { - struct ibuf *buf; - struct mapping_entry *me; struct ldp_hdr *ldp_hdr; - u_int16_t tlv_size, size; - - if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) - fatal("send_labelmapping"); - - /* real size will be set up later */ - gen_ldp_hdr(buf, 0); - - size = LDP_HDR_SIZE - TLV_HDR_LEN; - - TAILQ_FOREACH(me, &nbr->mapping_list, entry) { - tlv_size = BASIC_LABEL_MAP_LEN + PREFIX_SIZE(me->map.prefixlen); - if (me->map.flags & F_MAP_REQ_ID) - tlv_size += REQID_TLV_LEN; - size += tlv_size; - - gen_msg_tlv(buf, MSG_TYPE_LABELMAPPING, tlv_size); - gen_fec_tlv(buf, me->map.prefix, me->map.prefixlen); - gen_label_tlv(buf, me->map.label); - if (me->map.flags & F_MAP_REQ_ID) - gen_reqid_tlv(buf, me->map.requestid); - } - - /* XXX: should we remove them first? */ - mapping_list_clr(&nbr->mapping_list); ldp_hdr = ibuf_seek(buf, 0, sizeof(struct ldp_hdr)); ldp_hdr->length = htons(size); - evbuf_enqueue(&nbr->tcp->wbuf, buf); - nbr_fsm(nbr, NBR_EVT_PDU_SENT); } -/* Label Request Message */ +/* Generic function that handles all Label Message types */ void -send_labelrequest(struct nbr *nbr) +send_labelmessage(struct nbr *nbr, u_int16_t type, struct mapping_head *mh) { - struct ibuf *buf; + struct ibuf *buf = NULL; struct mapping_entry *me; - struct ldp_hdr *ldp_hdr; - u_int16_t tlv_size, size; - - if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) - fatal("send_labelrequest"); - - /* real size will be set up later */ - gen_ldp_hdr(buf, 0); - - size = LDP_HDR_SIZE - TLV_HDR_LEN; - - TAILQ_FOREACH(me, &nbr->request_list, entry) { - tlv_size = PREFIX_SIZE(me->map.prefixlen); - size += tlv_size; - - gen_msg_tlv(buf, MSG_TYPE_LABELREQUEST, tlv_size); - gen_fec_tlv(buf, me->map.prefix, me->map.prefixlen); - } - - /* XXX: should we remove them first? */ - mapping_list_clr(&nbr->request_list); + u_int16_t tlv_size, size = 0; + int first = 1; - ldp_hdr = ibuf_seek(buf, 0, sizeof(struct ldp_hdr)); - ldp_hdr->length = htons(size); + while ((me = TAILQ_FIRST(mh)) != NULL) { + /* generate pdu */ + if (first) { + if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) + fatal("send_labelmapping"); - evbuf_enqueue(&nbr->tcp->wbuf, buf); - nbr_fsm(nbr, NBR_EVT_PDU_SENT); -} + /* real size will be set up later */ + gen_ldp_hdr(buf, 0); -/* Label Withdraw Message */ -void -send_labelwithdraw(struct nbr *nbr) -{ - struct ibuf *buf; - struct mapping_entry *me; - struct ldp_hdr *ldp_hdr; - u_int16_t tlv_size, size; - - if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) - fatal("send_labelwithdraw"); - - /* real size will be set up later */ - gen_ldp_hdr(buf, 0); + size = LDP_HDR_PDU_LEN; + first = 0; + } - size = LDP_HDR_SIZE - TLV_HDR_LEN; + /* calculate size */ + tlv_size = LDP_MSG_LEN + TLV_HDR_LEN + FEC_ELM_MIN_LEN + + PREFIX_SIZE(me->map.prefixlen); + if (type == MSG_TYPE_LABELMAPPING || + me->map.flags & F_MAP_OPTLABEL) + tlv_size += LABEL_TLV_LEN; + if (me->map.flags & F_MAP_REQ_ID) + tlv_size += REQID_TLV_LEN; - TAILQ_FOREACH(me, &nbr->withdraw_list, entry) { - if (me->map.label == NO_LABEL) - tlv_size = PREFIX_SIZE(me->map.prefixlen); - else - tlv_size = BASIC_LABEL_MAP_LEN + - PREFIX_SIZE(me->map.prefixlen); + /* maximum pdu length exceeded, we need a new ldp pdu */ + if (size + tlv_size > LDP_MAX_LEN) { + enqueue_pdu(nbr, buf, size); + first = 1; + continue; + } size += tlv_size; - gen_msg_tlv(buf, MSG_TYPE_LABELWITHDRAW, tlv_size); + /* append message and tlvs */ + gen_msg_tlv(buf, type, tlv_size); gen_fec_tlv(buf, me->map.prefix, me->map.prefixlen); - - if (me->map.label != NO_LABEL) + if (type == MSG_TYPE_LABELMAPPING || + me->map.flags & F_MAP_OPTLABEL) gen_label_tlv(buf, me->map.label); - } - - /* XXX: should we remove them first? */ - mapping_list_clr(&nbr->withdraw_list); - - ldp_hdr = ibuf_seek(buf, 0, sizeof(struct ldp_hdr)); - ldp_hdr->length = htons(size); - - evbuf_enqueue(&nbr->tcp->wbuf, buf); - nbr_fsm(nbr, NBR_EVT_PDU_SENT); -} - -/* Label Release Message */ -void -send_labelrelease(struct nbr *nbr) -{ - struct ibuf *buf; - struct mapping_entry *me; - struct ldp_hdr *ldp_hdr; - u_int16_t tlv_size, size; - - if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) - fatal("send_labelrelease"); - - /* real size will be set up later */ - gen_ldp_hdr(buf, 0); - - size = LDP_HDR_SIZE - TLV_HDR_LEN; - - TAILQ_FOREACH(me, &nbr->release_list, entry) { - if (me->map.label == NO_LABEL) - tlv_size = PREFIX_SIZE(me->map.prefixlen); - else - tlv_size = BASIC_LABEL_MAP_LEN + - PREFIX_SIZE(me->map.prefixlen); - - size += tlv_size; - - gen_msg_tlv(buf, MSG_TYPE_LABELRELEASE, tlv_size); - gen_fec_tlv(buf, me->map.prefix, me->map.prefixlen); + if (me->map.flags & F_MAP_REQ_ID) + gen_reqid_tlv(buf, me->map.requestid); - if (me->map.label != NO_LABEL) - gen_label_tlv(buf, me->map.label); + TAILQ_REMOVE(mh, me, entry); + free(me); } - /* XXX: should we remove them first? */ - mapping_list_clr(&nbr->release_list); - - ldp_hdr = ibuf_seek(buf, 0, sizeof(struct ldp_hdr)); - ldp_hdr->length = htons(size); - - evbuf_enqueue(&nbr->tcp->wbuf, buf); - nbr_fsm(nbr, NBR_EVT_PDU_SENT); -} - -/* Label Abort Req Message */ -void -send_labelabortreq(struct nbr *nbr) -{ - struct ibuf *buf; - u_int16_t size; - - if ((buf = ibuf_open(LDP_MAX_LEN)) == NULL) - fatal("send_labelabortreq"); - - size = LDP_HDR_SIZE + sizeof(struct ldp_msg); + enqueue_pdu(nbr, buf, size); - gen_ldp_hdr(buf, size); - - size -= LDP_HDR_SIZE; - - gen_msg_tlv(buf, MSG_TYPE_LABELABORTREQ, size); - - evbuf_enqueue(&nbr->tcp->wbuf, buf); nbr_fsm(nbr, NBR_EVT_PDU_SENT); } @@ -239,6 +124,7 @@ recv_labelmessage(struct nbr *nbr, char *buf, u_int16_t len, u_int16_t type) struct tlv ft; u_int32_t label, reqid; u_int8_t flags = 0; + int feclen, lbllen, tlen; u_int8_t addr_type; struct mapping_entry *me; diff --git a/usr.sbin/ldpd/ldp.h b/usr.sbin/ldpd/ldp.h index d5a571422d2..5650c05a3fb 100644 --- a/usr.sbin/ldpd/ldp.h +++ b/usr.sbin/ldpd/ldp.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ldp.h,v 1.15 2013/10/15 19:59:53 renato Exp $ */ +/* $OpenBSD: ldp.h,v 1.16 2013/10/17 17:52:21 renato Exp $ */ /* * Copyright (c) 2009 Michele Marchetto <michele@openbsd.org> @@ -192,8 +192,6 @@ struct address_list_tlv { /* address entries */ } __packed; -#define BASIC_LABEL_MAP_LEN 24 - #define ADDR_IPV4 0x1 #define ADDR_IPV6 0x2 diff --git a/usr.sbin/ldpd/ldpe.c b/usr.sbin/ldpd/ldpe.c index b20585e800c..72412d5f5b8 100644 --- a/usr.sbin/ldpd/ldpe.c +++ b/usr.sbin/ldpd/ldpe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ldpe.c,v 1.21 2013/06/04 02:25:28 claudio Exp $ */ +/* $OpenBSD: ldpe.c,v 1.22 2013/10/17 17:52:21 renato Exp $ */ /* * Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org> @@ -523,13 +523,16 @@ ldpe_dispatch_lde(int fd, short event, void *bula) switch (imsg.hdr.type) { case IMSG_MAPPING_ADD_END: - send_labelmapping(nbr); + send_labelmessage(nbr, MSG_TYPE_LABELMAPPING, + &nbr->mapping_list); break; case IMSG_RELEASE_ADD_END: - send_labelrelease(nbr); + send_labelmessage(nbr, MSG_TYPE_LABELRELEASE, + &nbr->release_list); break; case IMSG_REQUEST_ADD_END: - send_labelrequest(nbr); + send_labelmessage(nbr, MSG_TYPE_LABELREQUEST, + &nbr->request_list); break; } break; diff --git a/usr.sbin/ldpd/ldpe.h b/usr.sbin/ldpd/ldpe.h index 8b25e9a86c4..9d1a8186d83 100644 --- a/usr.sbin/ldpd/ldpe.h +++ b/usr.sbin/ldpd/ldpe.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ldpe.h,v 1.30 2013/10/17 17:47:04 renato Exp $ */ +/* $OpenBSD: ldpe.h,v 1.31 2013/10/17 17:52:21 renato Exp $ */ /* * Copyright (c) 2004, 2005, 2008 Esben Norby <norby@openbsd.org> @@ -122,12 +122,8 @@ void send_address_withdraw(struct nbr *, struct if_addr *); /* labelmapping.c */ #define PREFIX_SIZE(x) (((x) + 7) / 8) +void send_labelmessage(struct nbr *, u_int16_t, struct mapping_head *); int recv_labelmessage(struct nbr *, char *, u_int16_t, u_int16_t); -void send_labelmapping(struct nbr *); -void send_labelrequest(struct nbr *); -void send_labelwithdraw(struct nbr *); -void send_labelrelease(struct nbr *); -void send_labelabortreq(struct nbr *); /* ldpe.c */ pid_t ldpe(struct ldpd_conf *, int[2], int[2], int[2]); |