summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--usr.sbin/ldpd/labelmapping.c198
-rw-r--r--usr.sbin/ldpd/ldp.h4
-rw-r--r--usr.sbin/ldpd/ldpe.c11
-rw-r--r--usr.sbin/ldpd/ldpe.h8
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]);