]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: tx addpath info for labeled unicast
authorQuentin Young <qlyoung@cumulusnetworks.com>
Tue, 6 Aug 2019 21:18:42 +0000 (21:18 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Tue, 6 Aug 2019 21:46:46 +0000 (21:46 +0000)
Labeled unicast needs path IDs too!

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
bgpd/bgp_attr.c
lib/stream.c
lib/stream.h

index c64d153f1b8c67fd6b238f54fb0091d747e7d45e..e21c84355e22cd34f9d41a5dadb16652b3f6f479 100644 (file)
@@ -2956,7 +2956,8 @@ void bgp_packet_mpattr_prefix(struct stream *s, afi_t afi, safi_t safi,
                                       addpath_encode, addpath_tx_id);
        } else if (safi == SAFI_LABELED_UNICAST) {
                /* Prefix write with label. */
-               stream_put_labeled_prefix(s, p, label);
+               stream_put_labeled_prefix(s, p, label, addpath_encode,
+                                         addpath_tx_id);
        } else if (safi == SAFI_FLOWSPEC) {
                if (PSIZE (p->prefixlen)+2 < FLOWSPEC_NLRI_SIZELIMIT)
                        stream_putc(s, PSIZE (p->prefixlen)+2);
index 6c187bd359a842b558b190c50ed031db3a9c7bfa..c67bc3c99338fdf60e0459454d15d0d739739679 100644 (file)
@@ -904,20 +904,30 @@ int stream_put_prefix(struct stream *s, struct prefix *p)
 
 /* Put NLRI with label */
 int stream_put_labeled_prefix(struct stream *s, struct prefix *p,
-                             mpls_label_t *label)
+                             mpls_label_t *label, int addpath_encode,
+                             uint32_t addpath_tx_id)
 {
        size_t psize;
+       size_t psize_with_addpath;
        uint8_t *label_pnt = (uint8_t *)label;
 
        STREAM_VERIFY_SANE(s);
 
        psize = PSIZE(p->prefixlen);
+       psize_with_addpath = psize + (addpath_encode ? 4 : 0);
 
-       if (STREAM_WRITEABLE(s) < (psize + 3)) {
+       if (STREAM_WRITEABLE(s) < (psize_with_addpath + 3)) {
                STREAM_BOUND_WARN(s, "put");
                return 0;
        }
 
+       if (addpath_encode) {
+               s->data[s->endp++] = (uint8_t)(addpath_tx_id >> 24);
+               s->data[s->endp++] = (uint8_t)(addpath_tx_id >> 16);
+               s->data[s->endp++] = (uint8_t)(addpath_tx_id >> 8);
+               s->data[s->endp++] = (uint8_t)addpath_tx_id;
+       }
+
        stream_putc(s, (p->prefixlen + 24));
        stream_putc(s, label_pnt[0]);
        stream_putc(s, label_pnt[1]);
index 5341bfa40bde4468dfd8eee46f062123078d9562..a903ec0ea51a21248b0b5a3f3ba7d025cfa0ac1c 100644 (file)
@@ -199,7 +199,8 @@ extern int stream_put_prefix_addpath(struct stream *, struct prefix *,
                                     uint32_t addpath_tx_id);
 extern int stream_put_prefix(struct stream *, struct prefix *);
 extern int stream_put_labeled_prefix(struct stream *, struct prefix *,
-                                    mpls_label_t *);
+                                    mpls_label_t *, int addpath_encode,
+                                    uint32_t addpath_tx_id);
 extern void stream_get(void *, struct stream *, size_t);
 extern bool stream_get2(void *data, struct stream *s, size_t size);
 extern void stream_get_from(void *, struct stream *, size_t, size_t);